大家都知道,在安卓6.0以前,權限是在安裝APP的時候以列表的形式體現出來的,這對用戶很不友好,很多流氓軟件就因此大肆猖獗,盜取用戶信息;
在6.0的時候google終于意識到這個問題,以動態的方式去獲取權限,需要用戶一個一個去允許,用戶友好了,碼農又苦逼了哈哈,因為所謂的‘動態’,其實是不動態的,也就是說,權限并不會直接跳出來,而是需要碼農手動去處理,其代碼量以及邏輯性很難處理,于是很多大神就對權限進行了封裝處理:
PermissionsDispatcher
使用標注的方式,動態生成類處理運行時權限,目前還不支持嵌套Fragment。
RxPermissions
基于RxJava的運行時權限檢測框架
Grant
簡化運行時權限的處理,比較靈活
android-RuntimePermissions
Google官方的例子
其中最著名的莫過于PermissionsDispatcher;
首先Project Build中添加:
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
然后在app module中添加:
apply plugin: 'android-apt'
dependencies {
compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
}
Project Build
app module
之后就可以在Activity中進行權限申請的操作了:
Alt+Insert
選擇相機權限
@NeedsPermission(Manifest.permission.CAMERA)
void showCamera() {
Toast.makeText(this, "用戶允許后", Toast.LENGTH_SHORT).show();
}
@OnShowRationale(Manifest.permission.CAMERA)
void showRationaleForCamera(final PermissionRequest request) {
Toast.makeText(this, ""用戶拒絕后選擇再次出現", Toast.LENGTH_SHORT).show();
}
@OnPermissionDenied(Manifest.permission.CAMERA)
void showDeniedForCamera() {
Toast.makeText(this, "每次拒絕調用", Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)
void showNeverAskForCamera() {
Toast.makeText(this, "每次觸發都會詢問一次", Toast.LENGTH_SHORT).show();
}
觸發動態權限:
//觸發動態權限
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivityPermissionsDispatcher.cameraStartWithCheck(MainActivity.this);
}
});
MUI
以下代碼為自動生成:
@NeedsPermission(Manifest.permission.CAMERA)
void cameraStart() {
//業務處理
textView.setText("您獲取到了權限");
System.out.println("開啟權限");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
.