Android 6.0 權限處理
1.問題描述
- 使用PandaAndroidLibs庫時,在MainApplication初始化存儲數據配置時
AppDirConfiguration.configure(getApplicationContext());
用到手機存儲權限,如果權限未開啟,則導致App崩潰。
- 在手機上相機權限被拒絕,打開相機,出現程序崩潰的現象。
2.問題原因
Android M(版本號6.0 api:23)對原來的權限系統做了升級。
對比android6.0之前有什么區別
- 在targetSdkVersion 23以下時
對于權限主需要在安裝時被詢問一次,而且是批量處理的。用戶同意安裝后,無需再次申請。
-
在targetSdkVersion 23以上時
對于危險權限是需要單獨處理的,app在運行時只要接觸了危險權限,就會彈窗提醒,詢問用戶是否授權。
3.場景分類
- 界面打開時,需要對權限進行判斷。 全部獲取所需權限加載該頁面,未獲取需要跳轉設置頁面進行設置
- 點擊跳轉之前對權限進行判斷,全部獲取跳轉相應的頁面,未獲取需要跳轉設置頁面進行設置
4.問題解決方式
解決方案有兩種:
(不推薦)不要用23的sdk編譯,即 targetSdkVersion和compileSdkVersion不要等于23。基于兼容性原則,Android對用23已下sdk編譯的app依然使用舊的權限模型。
(在實際使用時,android 6.0手機上關閉權限,仍然會導致程序崩潰問題)自己在需要用到權限前進行權限判斷,提醒用戶打開相應的權限。使用框架RxPermissions利用RxJava解決權限
5.框架RxPermissions 利用RxJava解決權限
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()方法或者點擊事件中onClick();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RxPermissions.getInstance(this)
.request(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)//這里申請了兩組權限
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
//同意后跳轉
LaunchActivity.this.startActivity(new Intent(LaunchActivity.this, LoginActivity.class));
LaunchActivity.this.finish();
} else {
//不同意,給提示
Toast.makeText(LaunchActivity.this, "請同意軟件的權限,才能繼續提供服務", Toast.LENGTH_LONG).show();
}
}
});
}
5.3 解決使用PandaAndroidLibs庫時,手機存儲為必須權限解決方式
- 在MainApplication中
try {
AppDirConfiguration.configure(getApplicationContext());
DataCacheManager.init(getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
- 在LaunchFragment中檢查權限,讀寫權限為必須權限。
6.對權限的劃分
在整個權限列表內,權限可以分為normal,dangerous,special類型其實special也屬于dangerous類型,但是他的請求方式需要通過,
隱式意圖來處理,下面是危險權限和特殊權限的列表
dangerous permission(危險權限)
Paste_Image.png
special permission(特殊權限)
需要通過隱式意圖來開啟(暫不介紹)
WRITE_SETTINGS
SYSTEM_ALERT_WINDOW