android

Android修真传之AndPermission的使用

2018-05-23  本文已影响5人  请卜要动朕
版本1.0.0

Android碎片化太严重不同手机进行适配难度非常大,可想而知搞android是件多难的事情,然而在不同手机产商中在动态申请权限的时候有些就出问题了,会一直返回true,从而没有进行申请权限导致无法执行业务代码,在Github搜了一下看到AndPermission就顺便试了一下,没想到这个权限框架不仅封装的简单采用链式调用,并且最大程度适配国内各大产商的ROM。

具体使用

首先添加依赖

Gradle   
    implementation 'com.yanzhenjie:permission:2.0.0-rc4'

Maven 
    <dependency>
      <groupId>com.yanzhenjie</groupId>
      <artifactId>permission</artifactId>
      <version>2.0.0-rc4</version>
    </dependency>

//混淆
-dontwarn com.yanzhenjie.permission.**

请求单个权限

//注意,这里申请的权限是使用Permission这个类下的,而不是系统的Manifest.permission.xxx
AndPermission.with(this)
    .permission(Permission.WRITE_EXTERNAL_STORAGE)
    .onGranted(new Action() {
        @Override
        public void onAction(List<String> permissions) {
            //申请成功.
        }
    }).onDenied(new Action() {
        @Override
        public void onAction(List<String> permissions) {
            //申请失败
        }
    })
    .start();

请求多个权限

//这里使用Permission.Group.你申请的权限组名称
AndPermission.with(this)
                .permission(Permission.Group.SMS)
                .onGranted(new Action() {
                    @Override
                    public void onAction(List<String> permissions) {
                        //申请成功.
                    }
                }).onDenied(new Action() {
            @Override
            public void onAction(List<String> permissions) {
                //申请失败
            }
        }).start();

请求单个权限组

//这里使用Permission.Group.你申请的权限组名称
AndPermission.with(this)
                .permission(Permission.Group.SMS)
                .onGranted(new Action() {
                    @Override
                    public void onAction(List<String> permissions) {
                        //申请成功.
                    }
                }).onDenied(new Action() {
            @Override
            public void onAction(List<String> permissions) {
                //申请失败
            }
        }).start();

请求多个权限组

 AndPermission.with(this)
                .permission( Permission.Group.STORAGE,
                             Permission.Group.CAMERA)
                .onGranted(new Action() {
                    @Override
                    public void onAction(List<String> permissions) {
                        //申请成功.
                    }
                }).onDenied(new Action() {
            @Override
            public void onAction(List<String> permissions) {
                //申请失败
            }
        }).start();

当用户点击拒绝时弹框让用户选择

AndPermission.with(this)
                .permission(Permission.ACCESS_FINE_LOCATION)
                .rationale(mRationale)  //变动的是这边
                .onGranted(new Action() {
                    @Override
                    public void onAction(List<String> permissions) {
                        //申请成功.
                    }
                }).onDenied(new Action() {
            @Override
            public void onAction(List<String> permissions) {
                //申请失败.
            }
        }).start();


private Rationale mRationale = new Rationale() {
        @Override
        public void showRationale(Context context, List<String> permissions,
                                  final RequestExecutor executor) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("请求权限")
                    .setMessage((CharSequence) Permission.transformText(context, permissions))
                    .setPositiveButton("同意", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            executor.execute();
                        }
                    })
                    .setNegativeButton("决绝", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            executor.cancel();
                        }
                    }).show();
        }
    };

当用户点击拒绝并不再提醒时还是继续弹框让用户选择

 AndPermission.with(this)
                .permission(Permission.CAMERA)
                .onGranted(new Action() {
                    @Override
                    public void onAction(List<String> permissions) {
                        //申请成功.
                    }
                }).onDenied(new Action() {
            @Override
            public void onAction(List<String> permissions) {
                //申请失败
                if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, permissions)) {
                    // 这些权限被用户总是拒绝。
                    final SettingService settingService = AndPermission.permissionSetting(MainActivity.this);
                    //创建对话框让用户同意使用该权限
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("请求权限")
                            .setMessage((CharSequence) Permission.transformText(MainActivity.this, permissions))
                            .setPositiveButton("同意", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    settingService.execute();
                                }
                            })
                            .setNegativeButton("决绝", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    settingService.cancel();
                                }
                            }).show();
                }

            }
        }).start();

我的手机是360 n5,在运行demo的时候只要点击拒绝会再次弹出系统框让我选择,从而就没有回调 mRationale中的showRationale方法。这就是每个系统的区别。

注意一下几点

1.请求单个权限或者权限组的时候使用的是Permission这个类下的
    如:Permission.WRITE_EXTERNAL_STORAGE

2.AndPermission可以在任何地方使用
    如:AndPermission.with(activity/fragment/context)

3.当用户拒绝时想要再次申请调用Rationale方法,在该方法中去申请

4.AndPermission.hasAlwaysDeniedPermission只能在onDenied()的回调中调用,不能在其它地方使用

上一篇下一篇

猜你喜欢

热点阅读