Android框架——PermissionsDispatcher

在我们开发应用时有时候可能会使用到一些敏感的权限,比如短信权限,电话权限等。如果要完整的处理一个具有权限的操作,需要关注以下几点:

  • 检测权限已有时的操作
  • 没有权限,申请权限成功的操作
  • 没有权限,申请权限失败的操作
  • 没有权限,申请权限失败,且勾选了不再提示时的操作

PermissionsDispatcher是一个在Android中可以通过注解形式申请动态申请权限的框架。使用PermissionsDispatcher框架可以使用注解来将每个点的处理方法简单的切入,使用方法如下,以下是在API 26环境下运行的情况。

1.Gradle引入

 dependencies {
    	...
        implementation 'com.github.hotchemi:permissionsdispatcher:3.2.0'
        annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.2.0'
      	...
    }

2.使用注解完善申请权限时的关键点

在使用PermissionsDispatcher框架时,有几个关键的注释需要了解:

  • @RuntimePermissions:加在Activity或者Fragment上,表明此界面有操作会使用到权限
  • @NeedsPermission(Manifest.permission.X):加在方法上,表明执行此方法前,需要获取到注解中的权限,如果没有权限就会自动申请,请求用户同意
  • @OnShowRationale(Manifest.permission.X):加在方法上,当用户第一次拒绝此权限时被调用,向用户说明为何需要此权限
  • @OnPermissionDenied(Manifest.permission.X):用户拒绝权限时调用
  • @OnNeverAskAgain(Manifest.permission.X):用户拒绝并勾选了不再提示时会调用

代码

//此处的注解表明此界面中的操作某些需要权限
@RuntimePermissions
public class PermissionActivity extends Activity {

    private Button btn_permission;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
        btn_permission = findViewById(R.id.btn_permission);
        btn_permission.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
				//这个类是在编译时自动生成的,里边有注释了NeedsPermission方法的一个带有权限注册的原方法可供调用。            
                PermissionActivityPermissionsDispatcher.callPhoneWithPermissionCheck(PermissionActivity.this);
            }
        });
    }

    /**
     * 打电话逻辑
     */
    @SuppressLint("MissingPermission")
    //关键注解,在编译时会生成带有权限检测过程的对应方法
    @NeedsPermission(Manifest.permission.CALL_PHONE)
    void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        try {
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	//用户申请权限第一次拒绝时会调用,再次向用户请求权限
    @OnShowRationale(Manifest.permission.CALL_PHONE)
    void showWhy(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setMessage("不接受权限无法运行!")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.proceed();
                    }
                }).show();
    }
	//用户再次拒绝权限时会调用
    @OnPermissionDenied(Manifest.permission.CALL_PHONE)
    void showDenied() {
        Toast.makeText(this, "拒绝了此权限", Toast.LENGTH_SHORT).show();
    }
	//拒绝并不再提示后会调用,之后调用原方法都会调用到此方法。
    @OnNeverAskAgain(Manifest.permission.CALL_PHONE)
    void showNotAsk() {
        new AlertDialog.Builder(this)
                .setMessage("不开不能打电话")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).show();
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //关键一行,得让权限框架获取到申请权限的结果
        PermissionActivityPermissionsDispatcher.onRequestPermissionsResult(this,requestCode, grantResults);
    }
}

总结

这个权限框架用起来还是挺简单的,对于老版本有一些变化,需要注意。

源码

待补充
源码地址:https://github.com/permissions-dispatcher/PermissionsDispatcher

你可能感兴趣的:(android)