Android 6.0权限适配permissionsdispatcher

由于国内ROM比较多,所以权限适配比较难做,我司的权限适配采用第三方库:permissionsdispatcher来做适配。当然如果你不想去做适配的话可以去设置targetSdkVersion小于23,但这样做的话google官方是不推荐的,同样个人觉得运行时权限可以给用户带来更好的体验和安全。

用法:
1、 引入:
在你的app/build下

 compile("com.github.hotchemi:permissionsdispatcher:3.0.1") {
        // if you don't use android.app.Fragment you can exclude support for them
        exclude module: "support-v13"
    }
    annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.0.1"

当然权限申请提供了一个一键生成插件:

Android 6.0权限适配permissionsdispatcher_第1张图片
image.png

这样就可以像用butterKnife的插件一样了。

看怎么玩的:
1、alt+insert快捷键

Android 6.0权限适配permissionsdispatcher_第2张图片
image.png

2、 如图:
最上面是你要申请的权限,下面左侧是几个注解方法:
分别是:
需要的权限。
权限遭到拒绝后,再次申请
权限未授权的回调方法
用户拒绝权限且选择了不再提示

Android 6.0权限适配permissionsdispatcher_第3张图片
image.png

生成的代码大概就是这样子:

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MainActivityPermissionsDispatcher.needsPermissionWithPermissionCheck(this);
    }


    @NeedsPermission({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
    void needsPermission() {

        Toast.makeText(this, "call 10086", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

    @OnShowRationale({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
    void showRationale(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("需要您授权存储、设备类型权限,否则将影响您的使用")
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                        request.cancel();
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.proceed();
                    }
                })
                .create()
                .show();
    }

    @OnPermissionDenied({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
    void permissionDenied() {
        Toast.makeText(this, "未授权", Toast.LENGTH_SHORT).show();
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("需要您授权存储、设备类型权限,否则将影响您的使用")
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        MainActivityPermissionsDispatcher.needsPermissionWithPermissionCheck(MainActivity.this);

                    }
                })
                .create()
                .show();


    }

    @OnNeverAskAgain({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
    void neverAskAgain() {
        Toast.makeText(this, "不再询问", Toast.LENGTH_SHORT).show();
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage("您已经禁止权限,需要去授权中心手动设置")
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent localIntent = new Intent();
                        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        if (Build.VERSION.SDK_INT >= 9) {
                            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                            localIntent.setData(Uri.fromParts("package", getPackageName(), null));
                        }
                        startActivity(localIntent);
                    }
                })
                .create()
                .show();
    }

}

以上是一个测试demo

遇到问题:
1、
刚开始添加依赖的时候,MainActivityPermissionsDispatcher
这个类怎么都找不到,后来google一把说,要rebuild,但是试了一下没有效果,然后我说重启AS,同样没效果,其实重新build和重启AS都一样,都是为了rebuild project。后来我重启了下电脑,可以了。至今也没弄明白为什么刚开始找不到这个类。官网说这个类是rebuild后生成的。

2、
申请流程:
一、 正常授权:
二、 未授权:提示用户授权,并且说明为什么要授权,有时权限必须要有,可以提示“xxx权限需要授权,若不授权则会影响用户使用“,若用户仍然选择不授权,则finish()应用,因为有些权限不授权却是影响app运行,如:获取设备ID,由于网络传输需要获取设备ID。
三、 用户选择“不再提示“既不再询问,也需要提示,为什么需要权限,且要引导用户去设置中心去手动开启权限。

四、 适配机型:
华为、oppo、三星、vivo、小米、一加(以上品牌的部分机型)
不过vivo、一加手机出现了问题:
Vivo:
进来系统会直接拒绝授权,但会弹窗提示,设置允许后,并不会去执行操作,而是第二次再进来才会去操作。
选择拒绝后,再次进来并不会弹窗提示。
一加:
拒绝后再次进来会询问,但勾选“不再询问“,下次进来不会弹窗提示。
设置允许,不会执行操作

五、当然还有其他第三方库,如: easypermissions
这是google出的权限申请库,但是对于国内厂商的手机来说,兼容性超级差,vivo、oppo不会提示授权,直接pass,还有华为的拒绝后,再次进入弹窗有问题

你可能感兴趣的:(Android 6.0权限适配permissionsdispatcher)