美文网首页android
Android修真传之AndPermission的使用

Android修真传之AndPermission的使用

作者: 请卜要动朕 | 来源:发表于2018-05-23 16:36 被阅读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()的回调中调用,不能在其它地方使用
    
    

    相关文章

      网友评论

        本文标题:Android修真传之AndPermission的使用

        本文链接:https://www.haomeiwen.com/subject/uwnrjftx.html