為什麼要定製自己的動態申請許可權庫 Android6.0之後,Android系統就要求敏感許可權需要動態申請。這位用戶帶來了很大的方便,也給開發者帶來了更大的挑戰。官方提供了相應的API供開發者使用,但是使用起來略顯麻煩。市場上也有很多開源許可權申請庫,之前有使用rxPermission,這次也有參考rx ...
為什麼要定製自己的動態申請許可權庫
Android6.0之後,Android系統就要求敏感許可權需要動態申請。這位用戶帶來了很大的方便,也給開發者帶來了更大的挑戰。官方提供了相應的API供開發者使用,但是使用起來略顯麻煩。市場上也有很多開源許可權申請庫,之前有使用rxPermission,這次也有參考rxPermission的代碼。使用開源庫固然很方便,但是我覺得,開源的意義在於提供一種思路,給其他同行一個借鑒,大家最好還是要會寫自己的庫,哪怕搓一點也沒關係。
動態申請許可權的思路
- 第一種:官方的寫法是在當前Activity申請許可權,在當前Activity回調結果。這種寫法很標準,但是很繁瑣,寫起來非常不方便。
- 第二種:之前看到一個同事寫的庫,他是跳到一個新的Activity,然後申請許可權,在該Activity監聽回調。這種方法達到了方便使用的效果,但是體驗不是很好。我寫的第一個版本就是這個方法。
- 第三種:在當前Activity添加一個Fragment,在該Fragment中申請許可權,併在該Fragment中監聽返回結果。這是rxPermission的思路,我覺得這是三種方法中最好的方法,最終版本也是採用的這個方法。
代碼實現步驟
- 首先,寫一個入口類:SchPermission,構造函數傳入activity,創建fragment添加到該activity。
- 然後,創建一個Fragment類:SchPermissionFragment。具體的申請許可權申請及申請結果回調都在該fragment中。
- 為了防止同時多次調用申請許可權介面,導致回調錯亂,每次申請許可權的requestCode都不一樣,創建一個HashMap存儲requestCode和callback,一一對應,防止回調錯亂。
使用例子
SchPermission mSchPermission = new SchPermission(this);
mSchPermission
.request(new String[] {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},
new
IPermissionCallback() {
@Override
public void onPermissionResult(@NonNull String[] permissions,
@NonNull int[] grantResults,
boolean[]
shouldShowRequestPermissionRationale) {
StringBuffer sb = new StringBuffer();
for (String str : permissions) {
sb.append(" ");
sb.append(str);
}
StringBuffer sb2 = new StringBuffer();
for (int i : grantResults) {
sb2.append(" ");
sb2.append(i);
}
StringBuffer sb3 = new StringBuffer();
for (boolean b : shouldShowRequestPermissionRationale) {
sb3.append(" ");
sb3.append(b);
}
Log.i(TAG, "permissions=" + sb.toString() + ",grantResults=" + sb2
.toString() + ",shouldShowRequestPermissionRationale=" + sb3
.toString());
}
});
後記
寫的比較簡單,請大家多多指教。
項目地址
https://github.com/shench5612390/SchPermission/tree/master