Android--权限申明第三方库

简介: 版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79741494 一、Androi...
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79741494

一、Android现在申请权限比较麻烦,在github查找到一个比较好用的库:AndPermission

依赖:

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

在Fragment中要加上下面的语句,Activity中则可以省略,但我处理方式是都加上了,本身就是一个父类的重写方法,activity中用不用看自己。

// 在Fragment中这句话不能注释,否则Fragment接收不到获取权限的通知。
super.onRequestPermissionsResult(requestCode,permissions,grantResults);

获取多个权限:

// 先判断是否有权限。
if(AndPermission.hasPermission(this, Manifest.permission.READ_SMS)) {
    // 有权限,直接do anything.
} else {
    // 申请权限。
    AndPermission.with(this)
        .requestCode(100)
        .permission(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_SMS)
        .send();
}

 

具体实现参考:https://blog.csdn.net/yanzhenjie1003/article/details/52503533

 

二、RxPermissions

 

必须在初始化阶段调用,例如onCreate()方法中

依赖:

 
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'

申请单个权限:

RxPermissions rxPermissions = new RxPermissions(MainActivity.this);
        rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE)
                .subscribe(new Observer<Boolean>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Toast.makeText(MainActivity.this, "应用需要读写权限", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onNext(Boolean value) {
                        if(value){
                            Toast.makeText(MainActivity.this, "同意权限", Toast.LENGTH_SHORT).show();
                        }else {
                            Toast.makeText(MainActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

同时申请多个权限并且分别判断权限是否授予:

RxPermissions rxPermission = new RxPermissions(getActivity());
        rxPermission
                .requestEach(Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_CALENDAR,
                        Manifest.permission.READ_CALL_LOG,
                        Manifest.permission.READ_CONTACTS,
                        Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.READ_SMS,
                        Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.CAMERA,
                        Manifest.permission.CALL_PHONE,
                        Manifest.permission.SEND_SMS)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                            // 用户已经同意该权限
                            Log.d(TAG, permission.name + " is granted.");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框
                            Log.d(TAG, permission.name + " is denied. More info should be provided.");
                        } else {
                            // 用户拒绝了该权限,并且选中『不再询问』
                            Log.d(TAG, permission.name + " is denied.");
                        }
                    }
                });

三、permissions4m国产手机5.0、6.0权限适配框架/编译时注解框架

引用

project 中的 build.gradle:

buildscript {
  // ...
}

allprojects {
  repositories {
    // 请添加如下一行
    maven { url 'https://jitpack.io' }
  }
}
app 中的 build.gradle:

dependencies {
  compile 'com.github.jokermonn:permissions4m:2.1.2-lib'
  annotationProcessor 'com.github.jokermonn:permissions4m:2.1.2-processor'
}

多个权限申请:

Permissions4M.get(NormalFragment.this)
        .requestPermissions(Manifest.permission.BODY_SENSORS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CALENDAR)
        .requestCodes(SENSORS_CODE, LOCATION_CODE, CALENDAR_CODE)
        .requestListener(new Wrapper.PermissionRequestListener() {
            @Override
            public void permissionGranted(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("地理位置权限授权成功 in fragment with annotation");
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("传感器权限授权成功 in fragment with annotation");
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("读取日历权限授权成功 in fragment with annotation");
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void permissionDenied(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("地理位置权限授权失败 in fragment with annotation");
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("传感器权限授权失败 in fragment with annotation");
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("读取日历权限授权失败 in fragment with annotation");
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void permissionRationale(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("请开启地理位置权限 in fragment with annotation");
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("请开启传感器权限 in fragment with annotation");
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("请开启读取日历权限 in fragment with annotation");
                        break;
                    default:
                        break;
                }
            }
        })
        .requestCustomRationaleListener(new Wrapper.PermissionCustomRationaleListener() {
            @Override
            public void permissionCustomRationale(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("请开启地理位置权限 in fragment with annotation");
                        Log.e("TAG", "permissionRationale: 请开启地理位置权限 ");

                        new AlertDialog.Builder(getActivity())
                                .setMessage("地理位置权限权限申请:\n我们需要您开启地理位置权限(in fragment with " +
                                        "annotation)")
                                .setPositiveButton("确定", new DialogInterface
                                        .OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Permissions4M.get(NormalFragment.this)
                                                .requestOnRationale()
                                                .requestPermissions(Manifest.permission
                                                        .ACCESS_FINE_LOCATION)
                                                .requestCodes(LOCATION_CODE)
                                                .request();
                                    }
                                })
                                .show();
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("请开启传感器权限 in fragment with annotation");
                        Log.e("TAG", "permissionRationale: 请开启传感器权限 ");

                        new AlertDialog.Builder(getActivity())
                                .setMessage("传感器权限申请:\n我们需要您开启传感器权限(in fragment with " +
                                        "annotation)")
                                .setPositiveButton("确定", new DialogInterface
                                        .OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Permissions4M.get(NormalFragment.this)
                                                .requestOnRationale()
                                                .requestPermissions(Manifest.permission
                                                        .BODY_SENSORS)
                                                .requestCodes(SENSORS_CODE)
                                                .request();
                                    }
                                })
                                .show();
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("请开启读取日历权限 in fragment with annotation");
                        Log.e("TAG", "permissionRationale: 请开启读取日历权限 ");

                        new AlertDialog.Builder(getActivity())
                                .setMessage("日历权限申请:\n我们需要您开启日历权限(in fragment with " +
                                        "annotation)")
                                .setPositiveButton("确定", new DialogInterface
                                        .OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Permissions4M.get(NormalFragment.this)
                                                .requestOnRationale()
                                                .requestPermissions(Manifest.permission
                                                        .READ_CALENDAR)
                                                .requestCodes(CALENDAR_CODE)
                                                .request();
                                    }
                                })
                                .show();
                        break;
                    default:
                        break;
                }

            }
        })
        .request();


总起来说,第三个库更加方便简明,建议使用。

目录
相关文章
|
4月前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
76 0
|
3月前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
68 2
|
7月前
|
Java Shell Android开发
android 权限申请
android 权限申请
118 5
|
7月前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
581 1
|
7月前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
340 0
Android系统 应用存储路径与权限
|
7月前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
430 5
|
7月前
|
XML API 数据库
Android权限
Android权限 【5月更文挑战第3天】
109 0
|
7月前
|
Android开发 开发者
Android打开开发者权限
Android打开开发者权限
73 0
|
7月前
|
Android开发
Android 9.0中sdcard 的权限和挂载问题
Android 9.0中sdcard 的权限和挂载问题
85 0
|
7月前
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。 【5月更文挑战第2天】
312 0