目前我想基本上所有的安卓開發(fā)都清楚,android 6.0以上的操作系統(tǒng)新增了權(quán)限申請(qǐng)的控制,提高了用戶安全度,然而在開發(fā)中針對(duì)權(quán)限申請(qǐng),我們也有需要注意的一些問題點(diǎn)存在,最近開發(fā)中就遇到了。
問題一:
即使應(yīng)用程序關(guān)閉了權(quán)限,使用ActivityCompat.checkSelfPermission(context,permission),返回的值一直都是已授權(quán)。
原因:
因?yàn)轫?xiàng)目用的targetSDKVersion是22(為了支持硬件設(shè)備),首先程序在安裝時(shí)會(huì)默認(rèn)同意申請(qǐng)的所有權(quán)限,后續(xù)在設(shè)置中手動(dòng)關(guān)閉后,在程序里面加上權(quán)限檢測(cè)的代碼,檢測(cè)到的結(jié)果也是已授權(quán)的。
解決方法:
針對(duì)targetSDKVersion為22或者系統(tǒng)版本為22以下的,我們可以使用supportV4里面提供的檢測(cè)權(quán)限的方法:PermissionChecker.checkSelfPermission(),從而可以得到準(zhǔn)確的權(quán)限判斷。
問題二:
當(dāng)程序啟動(dòng)后,再去手動(dòng)修改程序某些權(quán)限的開關(guān),回到程序會(huì)出現(xiàn)奔潰現(xiàn)象
原因:
當(dāng)我們?nèi)サ皆O(shè)置界面修改程序的權(quán)限時(shí),此時(shí)程序頂層Activity會(huì)調(diào)用onSaveInstanceState(Bundle outState)的生命周期函數(shù),對(duì)當(dāng)前的界面的一些數(shù)據(jù)做緩存。當(dāng)我們修改權(quán)限后再回到程序,此時(shí)程序會(huì)重啟當(dāng)前的Activity,而在onCreate中檢測(cè)到有緩存,就會(huì)根據(jù)緩存的數(shù)據(jù)幫助我們重新渲染界面,初始化數(shù)據(jù)等。這個(gè)時(shí)候我們?cè)偃プ鲆恍┬枰崆笆跈?quán)的業(yè)務(wù)時(shí)(比如拍照),可能會(huì)出現(xiàn)導(dǎo)致程序奔潰的情況。
解決方法:
1、首先重寫onSaveInstanceState方法,不調(diào)用其父類方法進(jìn)行保存數(shù)據(jù)。
2、在onCreate方法中,先判定傳入的bundle值是否為空,如果不為空,可以選擇重啟我們的應(yīng)用。