前幾天開了一個新項目雷绢,開發(fā)過程中遇到了一個極其奇葩的問題,
我做的項目采用了最新的Android Studio測試版本開發(fā)峰弹,程序需要訪問網(wǎng)絡(luò)、獲取手機狀態(tài)等權(quán)限芜果,這很正常對吧鞠呈?
可是做好的程序測試在Android L以下(包含L)是正常的,在Android M+安裝時提示:
“該程序不需要任何權(quán)限”
納尼师幕?不需要任何權(quán)限粟按?你?逗我诬滩?
然后呢霹粥,程序運行過程中不出意外的崩潰了
日志顯示崩潰的原因是沒有聲明權(quán)限..........WTF,我還不至于傻到?jīng)]在Android Manifests聲明權(quán)限呀(╯‵□′)╯︵┻━┻
然后呢我嘗試呢在低版本(Android L)測試模擬器上運行了下疼鸟,一切正常后控,在Android4.4.4-更是運行的飛起......
Android M的設(shè)置-應(yīng)用管理中找到我的程序后,權(quán)限中的選項竟然全是關(guān)掉的空镜,手動開啟后運行一切正常
怎么回事......
別急浩淘,讓我想想,我建立工程使用的是最新測試版本的Android Studio吴攒,是不是這原因张抄?換了個穩(wěn)定版的,結(jié)果還是不出意外的崩潰了...
好吧洼怔,不是兼容問題啊署惯,那我再想想,Android M是不是高了點啥特別的東西镣隶?
網(wǎng)上搜了下Android M的更新日志.......嗯极谊,新的權(quán)限管理?什么鬼安岂?
于是乎轻猖,原因其實是Android M開始將權(quán)限做成了動態(tài)調(diào)用的......好吧谷歌你夠潮
真正原因
以下來自谷歌官方的解釋:
Beginning in Android 6.0 (API level 23), users grant permissions to
apps while the app is running, not when they install the app. This
approach streamlines the app install process, since the user does not
need to grant permissions when they install or update the app. It also
gives the user more control over the app's functionality; for example, a
user could choose to give a camera app access to the camera but not to
the device location. The user can revoke the permissions at any time, by
going to the app's Settings screen.
不廢話了,上解決辦法......
解決辦法
exp.我們常用的打電話:
final public static int REQUEST_CODE_ASK_CALL_PHONE = 123;
public void onCall(String mobile){
this.mMobile = mobile;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(mContext,Manifest.permission.CALL_PHONE);
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(mContext,new String[]{Manifest.permission.CALL_PHONE},REQUEST_CODE_ASK_CALL_PHONE);
return;
}else{
//調(diào)用撥號
callDirectly(mobile);
}
} else {
//調(diào)用撥號
callDirectly(mobile);
}
}
//回調(diào)方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_CALL_PHONE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用戶點擊了允許獲取權(quán)限
callDirectly(mobile);
} else {
// 用戶點擊了不允許獲取權(quán)限
Toast.makeText(MainActivity.this, "CALL_PHONE Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
然后域那,當我們的程序需要打電話的時候會彈出確認對話框:“是否允許XXX撥打電話”...好了完美解決........么咙边?
這不蛋疼么每次調(diào)用個權(quán)限還得寫這么一長串代碼,Android Manifests聲明也不能去掉否則低版本手機上程序有得崩掉了......
好吧次员,有開源的庫可以幫你解決這問題:傳送門:https://github.com/k0shk0sh/PermissionHelper
不還得麻煩样眠?好吧我就說說我是怎么解決的吧,干一件事就行翠肘,簡單快捷方便檐束!
雖然可能是暫時可以這么玩的,但目前在谷歌沒有統(tǒng)一權(quán)限問題的前提下還是沒問題的束倍。
完美解決方案(暫時):
修改Build.gradle中defaultConfig{}下的targetSdkVersion為22
就好了......
真的別打我被丧,這就是實實在在的碎片化盟戏,實實在在的坑,我相信不少同學應(yīng)該會掉進去吧甥桂?(笑)
//End
有興趣的朋友還可以前往我的Github?查看更多我的開源項目