Android運(yùn)行權(quán)限機(jī)制(二)

如果每個權(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);
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容