大家都知道,在安卓6.0以前次泽,權(quán)限是在安裝APP的時(shí)候以列表的形式體現(xiàn)出來(lái)的变秦,這對(duì)用戶(hù)很不友好成榜,很多流氓軟件就因此大肆猖獗,盜取用戶(hù)信息伴栓;
在6.0的時(shí)候google終于意識(shí)到這個(gè)問(wèn)題伦连,以動(dòng)態(tài)的方式去獲取權(quán)限,需要用戶(hù)一個(gè)一個(gè)去允許钳垮,用戶(hù)友好了,碼農(nóng)又苦逼了哈哈额港,因?yàn)樗^的‘動(dòng)態(tài)’饺窿,其實(shí)是不動(dòng)態(tài)的,也就是說(shuō)移斩,權(quán)限并不會(huì)直接跳出來(lái)肚医,而是需要碼農(nóng)手動(dòng)去處理绢馍,其代碼量以及邏輯性很難處理,于是很多大神就對(duì)權(quán)限進(jìn)行了封裝處理:
PermissionsDispatcher
使用標(biāo)注的方式肠套,動(dòng)態(tài)生成類(lèi)處理運(yùn)行時(shí)權(quán)限舰涌,目前還不支持嵌套Fragment。
RxPermissions
基于RxJava的運(yùn)行時(shí)權(quán)限檢測(cè)框架
Grant
簡(jiǎn)化運(yùn)行時(shí)權(quán)限的處理你稚,比較靈活
android-RuntimePermissions
Google官方的例子
其中最著名的莫過(guò)于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}'
}
之后就可以在Activity中進(jìn)行權(quán)限申請(qǐng)的操作了:
@NeedsPermission(Manifest.permission.CAMERA)
void showCamera() {
Toast.makeText(this, "用戶(hù)允許后", Toast.LENGTH_SHORT).show();
}
@OnShowRationale(Manifest.permission.CAMERA)
void showRationaleForCamera(final PermissionRequest request) {
Toast.makeText(this, ""用戶(hù)拒絕后選擇再次出現(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ā)都會(huì)詢(xún)問(wèn)一次", Toast.LENGTH_SHORT).show();
}
觸發(fā)動(dòng)態(tài)權(quán)限:
//觸發(fā)動(dòng)態(tài)權(quán)限
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivityPermissionsDispatcher.cameraStartWithCheck(MainActivity.this);
}
});
以下代碼為自動(dòng)生成:
@NeedsPermission(Manifest.permission.CAMERA)
void cameraStart() {
//業(yè)務(wù)處理
textView.setText("您獲取到了權(quán)限");
System.out.println("開(kāi)啟權(quán)限");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
.