android6.0新权限申请以及RxPermissions库的使用

原创 2017年04月10日 17:33:32

RxPermission

运行时权限介绍

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,
又新增了运行时权限动态检测,以下权限都需要在运行时判断:

  • 身体传感器
  • 日历
  • 摄像头
  • 通讯录
  • 地理位置
  • 麦克风
  • 电话
  • 短信
  • 存储空间
  • 运行时权限处理

Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,
所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,
但这也只是一个临时的救急策略,用户还是可以在设置中取消授予的权限。

声明目标SDK版本
我们需要在build.gradle中声明targetSdkVersion为23

android {
 compileSdkVersion 23
 buildToolsVersion "23.0.1"
 }
}

检查并申请权限

我们需要在用到权限的地方,每次都检查是否APP已经拥有权限,
比如我们有一个下载功能,需要写SD卡的权限,
我们在写入之前检查是否有WRITE_EXTERNAL_STORAGE权限,没有则申请权限

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
          != PackageManager.PERMISSION_GRANTED) {
      //申请WRITE_EXTERNAL_STORAGE权限
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
  }

请求权限后,系统会弹出请求权限的Dialog

这里写图片描述

用户选择允许或拒绝后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult

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

我们接着需要根据requestCode和grantResults(授权结果)做相应的后续处理

private void doNext(int requestCode, int[] grantResults) {
      if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
          if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              // Permission Granted
          } else {
              // Permission Denied
          }
      }
  }

Fragment中运行时权限的特殊处理

在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的onRequestPermissionsResult

如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不会回调回来,建议使用getParentFragment().requestPermissions方法,
这个方法会回调到父Fragment中的onRequestPermissionsResult,加入以下代码可以把回调透传到子Fragment

  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      List<Fragment> fragments = getChildFragmentManager().getFragments();
      if (fragments != null) {
          for (Fragment fragment : fragments) {
              if (fragment != null) {
                  fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
              }
          }
      }
  }

RxPermission:

用于适配Android 6.0新的权限模型的开源框架。

github地址:https://github.com/tbruyelle/RxPermissions

具体使用

  1. To use this library your minSdkVersion must be >= 11.

In your build.gradle :

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

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

2.具体代码

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

这个例子是在项目的启动页设置的,一次性请求了多个权限。
多个权限是用“ , ”分割开来的。
同时请求多个权限(分别获取结果)如果想要在同时请求多个权限,又想分别获取授权结果的话,可以调用requestEach方法或者ensureEach方法。

 private void requestPermissionList(final StartActivity activity) {
        new RxPermissions(activity)
                .requestEach(Manifest.permission.CALL_PHONE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.PROCESS_OUTGOING_CALLS,
                        Manifest.permission.SEND_SMS
                        )
                .subscribe(new Action1<Permission>() {
                    @Override
                    public void call(Permission permission) {
                        if(permission.granted){
                            // 获得授权
                            isGrantedAll = true;
                            Log.d(TAG,"isGrantedAll = " +isGrantedAll);

                            //AppUtil.showShortToast(activity,"您已经授权该权限");

                        }else{
                            isGrantedAll = false;
                            Log.d(TAG,"i///sGrantedAll = " +isGrantedAll);
                            //未获得授权
                            //AppUtil.showShortToast(activity,"您没有授权该权限,请在设置中打开授权");

                        }

                    }
                });
     }

以下是我从网上找的两个例子。主要的区别是在同时请求多个的情况下,处理不同的结果。
同时请求多个权限(合并结果)

比如同时申请拍照和录音权限

RxPermissions.getInstance(MainActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
    .subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean granted) {
        if (granted) { // 在android 6.0之前会默认返回true
            // 已经获取权限
            String jpgPath = getCacheDir() + "test.jpg";
            takePhotoByPath(jpgPath, 2);
        } else {
            // 未获取权限
            Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
        }
        }
    });

同时请求多个权限(分别获取结果)

如果想要在同时请求多个权限,又想分别获取授权结果的话,可以调用requestEach方法或者ensureEach方法

RxPermissions.getInstance(MainActivity.this).requestEach(Manifest.permission.CAMERA,
        Manifest.permission.RECORD_AUDIO)
        .subscribe(new Action1<Permission>() {
            @Override
            public void call(Permission permission) {
            if (permission.name.equals(Manifest.permission.CAMERA)) {
                if (permission.granted) {
                String jpgPath = getCacheDir() + "test.jpg";
                takePhotoByPath(jpgPath, 2);
                } else {
                //  未获取权限
                Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
                }

            } else if (permission.name.equals(Manifest.permission.RECORD_AUDIO)) {

            }
            }
        });
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Android开发之蓝牙详解(一)

一.概述这篇文章是我学习Android开发官网以及网上一些其他文章总结而来,主要就是为了好好研究一下蓝牙开发,看完这篇文章以后,我们就知道了怎样使用蓝牙API完成建立蓝牙连接的必要四步:1.打开蓝牙;...

android 6.0权限全面详细分析和解决方案

一、Marshmallow版本权限简介 android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西,而且一般...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Android 6.0 运行时权限管理最佳实践

在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把握不好这个变化,一是对这个权限策略和套路还没有摸透,二是没有一个很好的实践来支撑,很多人问我关于权限管理的问题,往往我都没有直接回...

Android 6.0权限机制及开发流程详解

介绍Android6.0的权限机制变更和权限申请流程
  • ccpat
  • ccpat
  • 2016-04-14 15:20
  • 10252

Android 6.0 运行时权限处理完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663; 本文出自:【张鸿洋的博客】 一、概述 随着A...

Android 高级开发——使用蓝牙技术实现终端间数据传输

蓝牙技术在智能硬件方面有很多用武之地,今天我就为大家分享一下蓝牙技术在Android系统下的使用方法技巧。蓝牙是一种短距离的无线通信技术标准,蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协...

谈谈Android 6.0 的动态权限管理

1.前言大家都知道Android 6.0的新特性之一就是应用权限的管理。也就是说凡是涉及用户隐私的权限,用户可以自己去设置管理了。然而在6.0以前,我们安装一款APP是默认同意此APP所需的所有权限(...

权限相关和第三方库PermissionsDispatcher

危险权限列表 相关文章:http://blog.csdn.net/lmj623565791/article/details/50709663

RxPermissions解决Android 6.0 获取运行权限问题

APP在适配6.0版本的时候,我们就需要给应用增加运行时权限管理。在6.0开始有一套新的权限管理机制便于更好的保护用户隐私,一般涉及用户隐私的都需要提示用户是否允许和拒绝APP使用该权限。RxPerm...

Android 音频采集(原始音频)

android平台上的音频采集一般就三种:1.利用android内置的应用程序 2.使用MediaRecorder进行音频捕获 3.使用audioRecord进行音频捕获。此3种的灵活性逐渐增...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)