如果每個權(quán)限的處理都要像上一篇寫的那樣處理,比較繁瑣,但是原理已經(jīng)掌握,可以使用開源的框架了,介紹開源權(quán)限處理PermissionDispatcher,使用了之后并沒有想象中那樣幾行代碼搞定的快感,但是十分的清晰,特別是在多個權(quán)限共存一個界面的時候。
核心注解介紹,前兩個必須實(shí)現(xiàn),其他按需求實(shí)現(xiàn):
@RuntimePermissions 注解在Activity或Fragment上
@NeedsPermission 注解在需要調(diào)用運(yùn)行時權(quán)限的方法上,調(diào)用這個權(quán)限時。
@OnShowRationale 注解在解釋為什么需要該權(quán)限的方法上,只有當(dāng)?shù)谝淮握埱髾?quán)限被用戶拒絕,下次請求權(quán)限之前會調(diào)用
@OnPermissionDenied 注解在當(dāng)用戶拒絕了權(quán)限請求時的方法上
@OnNeverAskAgain 注解在當(dāng)用戶勾選了不再詢問的方法上
github地址:https://github.com/permissions-dispatcher/PermissionsDispatcher
1)Gradle中引入PermissionDispatcher庫
implementation "com.github.hotchemi:permissionsdispatcher:3.0.1"
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.0.1"
2)實(shí)現(xiàn)庫提供的注解進(jìn)行權(quán)限的處理
@NeedsPermission(Manifest.permission.CALL_PHONE)
public void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "123");
intent.setData(data);
try{
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
@OnShowRationale(Manifest.permission.CALL_PHONE)
public void showReason(final PermissionRequest request){
new AlertDialog.Builder(this)
.setMessage("您撥打電話的操作需要授權(quán)")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
}).create().show();
}
@OnPermissionDenied(Manifest.permission.CALL_PHONE)
public void showDenied(){
//拒絕操作 或者提示
}
@OnNeverAskAgain(Manifest.permission.CALL_PHONE)
public void noAsk(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("您已拒絕當(dāng)前功能所需要的權(quán)限,無法正常工作");
builder.create().show();
}
3)重新編譯,交給生成類去管理權(quán)限
PermissionActivity2PermissionsDispatcher這個類是編譯之后提供的類,PermissionActivity2是你當(dāng)前容器的類名,交給這個生成類去管理。下面這個例子就是點(diǎn)擊之后需要申請權(quán)限
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PermissionActivity2PermissionsDispatcher.callPhoneWithPermissionCheck(PermissionActivity2.this);
}
});
同樣的onRequestPermissionsResult也要叫給生成類去管理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionActivity2PermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
在存在多個敏感權(quán)限的容器中(這里面是Activity),除了onRequestPermissionsResult之外,就正常的重新寫這幾個方法就好了??梢钥吹降氖?,代碼結(jié)構(gòu)清晰很多。
下面給出完整實(shí)例
@RuntimePermissions
public class PermissionActivity2 extends AppCompatActivity {
private Button btn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_permission);
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PermissionActivity2PermissionsDispatcher.callPhoneWithPermissionCheck(PermissionActivity2.this);
}
});
}
@NeedsPermission(Manifest.permission.CALL_PHONE)
public void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "123");
intent.setData(data);
try{
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
@OnShowRationale(Manifest.permission.CALL_PHONE)
public void showReason(final PermissionRequest request){
new AlertDialog.Builder(this)
.setMessage("您撥打電話的操作需要授權(quán)")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
}).create().show();
}
@OnPermissionDenied(Manifest.permission.CALL_PHONE)
public void showDenied(){
//拒絕操作 或者提示
}
@OnNeverAskAgain(Manifest.permission.CALL_PHONE)
public void noAsk(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("您已拒絕當(dāng)前功能所需要的權(quán)限,無法正常工作");
builder.create().show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionActivity2PermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}