大家都知道,在安卓6.0以前,權(quán)限是在安裝APP的時候以列表的形式體現(xiàn)出來的,這對用戶很不友好,很多流氓軟件就因此大肆猖獗,盜取用戶信息;
在6.0的時候google終于意識到這個問題,以動態(tài)的方式去獲取權(quán)限,需要用戶一個一個去允許,用戶友好了,碼農(nóng)又苦逼了哈哈,因?yàn)樗^的‘動態(tài)’,其實(shí)是不動態(tài)的,也就是說,權(quán)限并不會直接跳出來,而是需要碼農(nóng)手動去處理,其代碼量以及邏輯性很難處理,于是很多大神就對權(quán)限進(jìn)行了封裝處理:
PermissionsDispatcher
使用標(biāo)注的方式,動態(tài)生成類處理運(yùn)行時權(quán)限,目前還不支持嵌套Fragment。
RxPermissions
基于RxJava的運(yùn)行時權(quán)限檢測框架
Grant
簡化運(yùn)行時權(quán)限的處理,比較靈活
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中進(jìn)行權(quán)限申請的操作了:
Alt+Insert
選擇相機(jī)權(quán)限
@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, ""用戶拒絕后選擇再次出現(xiàn)", Toast.LENGTH_SHORT).show();
}
@OnPermissionDenied(Manifest.permission.CAMERA)
void showDeniedForCamera() {
Toast.makeText(this, "每次拒絕調(diào)用", Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)
void showNeverAskForCamera() {
Toast.makeText(this, "每次觸發(fā)都會詢問一次", Toast.LENGTH_SHORT).show();
}
觸發(fā)動態(tài)權(quán)限:
//觸發(fā)動態(tài)權(quán)限
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivityPermissionsDispatcher.cameraStartWithCheck(MainActivity.this);
}
});
MUI
以下代碼為自動生成:
@NeedsPermission(Manifest.permission.CAMERA)
void cameraStart() {
//業(yè)務(wù)處理
textView.setText("您獲取到了權(quán)限");
System.out.println("開啟權(quán)限");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
.