Android6.0以后Google不再允許開發(fā)者直接或許應(yīng)用的權(quán)限,需要在用戶知情的情況下授予權(quán)限,即需要用到權(quán)限的時(shí)候彈出一個(gè)權(quán)限提示框。
接下來我們將使用三種方式,完成運(yùn)行時(shí)權(quán)限的申請:
自己編寫代碼實(shí)現(xiàn),完全搞懂運(yùn)行時(shí)權(quán)限的申請。
使用Google官方簡化權(quán)限申請庫easypermissions實(shí)現(xiàn)。
使用結(jié)合RxJava的權(quán)限庫RxPermissions實(shí)現(xiàn)。
為了避免用戶沒有留意而拒絕了應(yīng)用的關(guān)鍵權(quán)限,我們必須對用戶授權(quán)時(shí)的各種狀態(tài)進(jìn)行詳細(xì)的分析。
用戶在授予權(quán)限時(shí)存在三種狀態(tài):
允許—授權(quán)成功,授權(quán)結(jié)束。
拒絕—授權(quán)失敗,下次申請仍會彈出提示框。如果權(quán)限是程序必須擁有的,則需要再次申請。
拒絕&不再詢問—拒絕一次后,下次會有該提示。若選擇拒絕并且不再詢問,下次申請則不會彈出提示框。如果權(quán)限是程序必須擁有的,則需要用戶到應(yīng)用管理中手動設(shè)置。
RxPermissions
結(jié)合RxJava的運(yùn)行時(shí)權(quán)限請求庫,必須結(jié)合RxJava使用,使用及其簡單。?
GitHub:https://github.com/tbruyelle/RxPermissions
1.添加
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
implementation 'io.reactivex.rxjava2:rxjava:2.1.9'
2.使用
RxPermissions rxPermissions = new RxPermissions(MainActivity.this); rxPermissions.requestEach(mPermissions).subscribe(new Consumer() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void accept(Permission permission) {
? ? ? ? ? ? ? ? ? ? ? ? Log.i(TAG, "accept: " + permission.toString());
? ? ? ? ? ? ? ? ? ? ? ? if (permission.granted) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //權(quán)限獲取成功
? ? ? ? ? ? ? ? ? ? ? ? } else if (permission.shouldShowRequestPermissionRationale) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //權(quán)限獲取失敗,但是沒有永久拒絕
? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //權(quán)限獲取失敗,而且被永久拒絕
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
3.總結(jié)
使用及其簡單,方便,代碼少。
只會申請沒有獲取的權(quán)限,無須篩選就不會重復(fù)獲取權(quán)限。
必須同時(shí)添加RxJava庫,必須先學(xué)習(xí)使用RxJava,使用成本偏高。
可以直接綁定點(diǎn)擊事件,使用場景更加豐富。
更多請看GitHub文檔https://github.com/tbruyelle/RxPermissions。
轉(zhuǎn)自:Android7.0運(yùn)行時(shí)權(quán)限的解決方案 - CSDN博客? ??