【第22期】观点:IT 行业加班,到底有没有价值?

[Android] Android M 运行时权限处理

原创 2016年06月01日 11:10:21

运行时权限介绍

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

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

运行时权限处理

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

  • 声明目标SDK版本
    我们需要在build.gradle中声明targetSdkVersion为23
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.yourcomany.app"
        minSdkVersion 18
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
     }
     buildTypes {
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           }
      }
}
  • 检查并申请权限
    我们需要在用到权限的地方,每次都检查是否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);
          }
      }
  }
}

相关阅读:Android 6.0+ 运行时权限探索

版权声明:本文为博主原创文章,技术需要传递,欢迎分享。 举报

相关文章推荐

Android M 新的运行时权限开发者需要知道的一切

转自:http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ android M 的名字官方刚发布不久,最终正式版即将来...

Android M 新的运行时权限开发者需要知道的一切

android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响。惊讶的是android社区鲜有谈论这事...

欢迎关注CSDN程序人生公众号

关注程序员生活,汇聚开发轶事。

Android应用资源---处理运行时改变(Handing Runtime Changes)

某些设备配置能够在运行期间进行改变(如屏幕的方向、键盘可用性、语言等)。当这样的改变发生时,Android会重启正在运行的Activity(onDestroy()回调之后,紧跟着调用<span style="font-fami
  • isiqi
  • isiqi
  • 2012-04-13 09:12
  • 324

Android M运行时权限详解

好久之前在网上看到国外一篇关于M的权限机制详解,由于是英文的,刚好最近闲的没事做,顺手翻译一下。 英文原文地址:https://inthecheesefactory.com/blog/things-y...

Android程序运行时权限与文件系统权限的区别

要区分apk运行时的拥有的权限与在文件系统上被访问(读写执行)的权限两个概念。apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。(一)linux文件系统上的权限-rwxr-x--x system   system       4156 2010-04-30 16:13 test.apk代表的是相应的用户/用户组及其他人

Android M 新的运行时权限开发者需要知道的一切

Sam其它相关参考: http://www.captechconsulting.com/blogs/runtime-permissions-best-practices-and-how-to-gra...

Android Permission大全出自1.0 SDK中记录着新改变的访问权限许可

Emck 我的技术生涯 刷破解版RC30的方法(注:在未升级官方RC30前) 2008年11月30日 网上的原文如下: http://forum.xda-developers.com/showthread.php?t=443797 注意:不敢保证每个人刷机会成功,有可能会使电话无法启动,大家在刷机前请慎重考虑。 一步一步更新修改后的RC30 第一步 你需要安装google android的USB驱动,那样你才可以使用 adb程序(它可以将文件上载或下载到你的手机,并且你可以用它打开shell命令) 下载google g1的usb驱动(http://dl.goog

Android M运行时权限

新运行时权限 android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西。 难怪一些坏蛋利用这个缺陷恶意收...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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