Android 6.0以上运行权限及RxPermissions的使用

简介: 传说Android 7.0的市场占有率终于1%了,Android 6.0基本上人人有了。

传说Android 7.0的市场占有率终于1%了,Android 6.0基本上人人有了。这个时候,我不得不把软件开发的SDK目标版本提升到了23。这是就要考虑实现权限的动态分配了。基于我项目用使用了RxJava,所以我就选择了RxPermissions框架来实现权限的动态分配。

一、了解权限

  权限分两种:普通权限、危险权限。普通权限在AndroidManifest.xml声明就可以了,危险权限在AndroidManifest.xml声明之后,还需要在软件运行的时候,动态的获取。目前危险权限一共有26个,其他的都是普通权限。
  Dangerous Permissions 共有26个:

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

android.permission.ANSWER_PHONE_CALLS

  一共九大分组,每个分组只要申请其中一个权限,其他权限都可以获得。最后一个是Android 8.0新添加的权限,是限制接听来电的权限。如果想查看其他权限可以查看访问权限API

二、RxPermissions

在GitHub上的地址是:https://github.com/tbruyelle/RxPermissions
  现在主要有两个分支,如下图:
这里写图片描述
  2.x分支是基于RxJava2的源码。master是基于Rxjava的源码。不管是RxJava、RxJava2对RxPermissions的使用没有影响,只是导入的依赖不一样。
  RxJava、RxJava2导入的依赖分别是:

compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'

RxPermissions的使用

1、minSdkVersion 必须大于等于11.

2、在build.gradle中配置。

如果没有的话,添加这个。

android {
    repositories {
        jcenter() // If not already there
    }
}

再添加依赖:
基于RxJava

dependencies {
    compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
}

基于RxJava2

dependencies {
    compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
}

3、初始化

RxPermissions rxPermissions = RxPermissions.getInstance(this);

4、使用方法

申请一个权限的方法:

// 假如申请调用系统拍照
rxPermissions.request(Manifest.permission.CAMERA)
        .subscribe(new Subscriber<Boolean>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(Boolean aBoolean) {
                // aBoolean:true开启成功 false开启失败
           }
});

申请多个权限的方法:

rxPermissions.request(Manifest.permission.CAMERA,
            Manifest.permission.ACCESS_FINE_LOCATION)
        .subscribe(new Subscriber<Boolean>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(Boolean aBoolean) {
                // aBoolean:true开启成功 false开启失败
                // 只要有一个权限申请失败,就返回false
           }
});

申请权限并查看申请结果的详细信息:

rxPermissions.requestEach(permissions)
        .subscribe(new Subscriber<Permission>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(Permission permission) {
                if (permission.granted) {
                    Log.e("申请成功:",permission.name);
                } else if (permission.shouldShowRequestPermissionRationale) {
                    Log.e("申请取消:",permission.name);
                } else {
                    Log.e("申请失败:",permission.name);
                }
             }
      });

  这个方法,是实现返回每个权限申请的结果。返回的是Permission 类。包含权限申请结果,包含:permission.granted表示申请成功;permission.shouldShowRequestPermissionRationale表示申请取消;如果这两个都不是,表示申请被拒绝,只能在设置界面手动开启。跳转至系统设置界面的方法:

/**
 * 获取应用详情页面intent
 */
private void getAppDetailSettingIntent() {
    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));
    } else {
        localIntent.setAction(Intent.ACTION_VIEW);
        localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
        localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
    }
    startActivity(localIntent);
    mContext.overridePendingTransitionEnter();
}

   github还提到了ensure、ensureEach 方法。也分别对应了返回的简单结果和详细结果。这两个方法是实现view绑定权限请求的框架RxBinding时使用的,RxBinding是要结合RxPermission使用的。RxBinding的GitHub地址
  权限的请求方法,最好写在onCreate()方法里,这样在启动界面的时候,会先检测权限信息。

目录
相关文章
|
2月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
303 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
6月前
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
171 2
|
10月前
|
Java API 开发工具
如何将python应用编译到android运行
【6月更文挑战第27天】本文介绍在Ubuntu 20上搭建Android开发环境,包括安装JRE/JDK,设置环境变量,添加i386架构,安装依赖和编译工具。并通过`p4a`命令行工具进行apk构建和清理。
343 6
如何将python应用编译到android运行
|
4月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
268 11
|
8月前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
128 0
|
6月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
635 2
|
7月前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
124 2
|
8月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
320 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
8月前
|
Android开发 iOS开发
[ionic]解决运行Android、IOS出现Could not find the web assets directory
[ionic]解决运行Android、IOS出现Could not find the web assets directory
83 1
|
10月前
|
前端开发 JavaScript 测试技术
下一篇
oss创建bucket