Android 6.0 權(quán)限處理
1.問題描述
- 使用PandaAndroidLibs庫時(shí),在MainApplication初始化存儲(chǔ)數(shù)據(jù)配置時(shí)
AppDirConfiguration.configure(getApplicationContext());
用到手機(jī)存儲(chǔ)權(quán)限,如果權(quán)限未開啟,則導(dǎo)致App崩潰。
- 在手機(jī)上相機(jī)權(quán)限被拒絕,打開相機(jī),出現(xiàn)程序崩潰的現(xiàn)象。
2.問題原因
Android M(版本號(hào)6.0 api:23)對(duì)原來的權(quán)限系統(tǒng)做了升級(jí)。
對(duì)比android6.0之前有什么區(qū)別
- 在targetSdkVersion 23以下時(shí)
對(duì)于權(quán)限主需要在安裝時(shí)被詢問一次,而且是批量處理的。用戶同意安裝后,無需再次申請(qǐng)。
-
在targetSdkVersion 23以上時(shí)
對(duì)于危險(xiǎn)權(quán)限是需要單獨(dú)處理的,app在運(yùn)行時(shí)只要接觸了危險(xiǎn)權(quán)限,就會(huì)彈窗提醒,詢問用戶是否授權(quán)。
3.場景分類
- 界面打開時(shí),需要對(duì)權(quán)限進(jìn)行判斷。 全部獲取所需權(quán)限加載該頁面,未獲取需要跳轉(zhuǎn)設(shè)置頁面進(jìn)行設(shè)置
- 點(diǎn)擊跳轉(zhuǎn)之前對(duì)權(quán)限進(jìn)行判斷,全部獲取跳轉(zhuǎn)相應(yīng)的頁面,未獲取需要跳轉(zhuǎn)設(shè)置頁面進(jìn)行設(shè)置
4.問題解決方式
解決方案有兩種:
(不推薦)不要用23的sdk編譯,即 targetSdkVersion和compileSdkVersion不要等于23?;诩嫒菪栽瓌t,Android對(duì)用23已下sdk編譯的app依然使用舊的權(quán)限模型。
(在實(shí)際使用時(shí),android 6.0手機(jī)上關(guān)閉權(quán)限,仍然會(huì)導(dǎo)致程序崩潰問題)自己在需要用到權(quán)限前進(jìn)行權(quán)限判斷,提醒用戶打開相應(yīng)的權(quán)限。使用框架RxPermissions利用RxJava解決權(quán)限
5.框架RxPermissions 利用RxJava解決權(quán)限
5.1 配置app的build.gradle:
dependencies {
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
compile 'io.reactivex:rxjava:1.1.6'
}
5.2 在Fragment中oncreatView()方法或者點(diǎn)擊事件中onClick();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RxPermissions.getInstance(this)
.request(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)//這里申請(qǐng)了兩組權(quán)限
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
//同意后跳轉(zhuǎn)
LaunchActivity.this.startActivity(new Intent(LaunchActivity.this, LoginActivity.class));
LaunchActivity.this.finish();
} else {
//不同意,給提示
Toast.makeText(LaunchActivity.this, "請(qǐng)同意軟件的權(quán)限,才能繼續(xù)提供服務(wù)", Toast.LENGTH_LONG).show();
}
}
});
}
5.3 解決使用PandaAndroidLibs庫時(shí),手機(jī)存儲(chǔ)為必須權(quán)限解決方式
- 在MainApplication中
try {
AppDirConfiguration.configure(getApplicationContext());
DataCacheManager.init(getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
- 在LaunchFragment中檢查權(quán)限,讀寫權(quán)限為必須權(quán)限。
6.對(duì)權(quán)限的劃分
在整個(gè)權(quán)限列表內(nèi),權(quán)限可以分為normal,dangerous,special類型其實(shí)special也屬于dangerous類型,但是他的請(qǐng)求方式需要通過,
隱式意圖來處理,下面是危險(xiǎn)權(quán)限和特殊權(quán)限的列表
dangerous permission(危險(xiǎn)權(quán)限)

special permission(特殊權(quán)限)
需要通過隱式意圖來開啟(暫不介紹)
WRITE_SETTINGS
SYSTEM_ALERT_WINDOW