谈谈Android6.0运行时的权限处理

 更新时间:2016年08月17日 15:28:24   投稿:daisy  
之前有人在 Android 6.0 的机型上运行了DragGridView结果出异常奔溃了。想必问题的原因大家都知道,是Android 6.0新引入了在运行时权限申请(Runtime Permissions)的功能。那么这所谓的运行时申请权限究竟是怎么一回事呢,下面跟着小编一起来看看吧!

运行时权限介绍

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,

又新增了运行时权限动态检测,以下权限都需要在运行时判断:

     1、身体传感器

     2、日历

     3、摄像头

     4、通讯录

     5、地理位置

     6、麦克风

     7、电话

     8、短信

     9、存储空间

在 Android 6.0 中,app 如果想要获得某些权限,会在应用中弹出一个对话框,让用户确认是否授予该权限。

具体的截图如下:

这要做的好处就是运行一个 app 时可以拒绝其中的某些权限,防止 app 触及到你的隐私(比如说通讯录、短信之类的)。而在 Android 6.0 之前,若同意安装 app ,就意味着该 app 可以获取权限列表中的所有权限。(注:这里所指的都是原生 Android 系统,比如 MIUI 之类的第三方 ROM 很早就具备了这种功能。)

接下来就来看看相关的 API 吧,首先我们来看看 Context.checkSelfPermission(String permission) 方法,该方法主要用于检测该 app 是否已经被赋予了某权限,传入的参数有。如果已被赋予,则返回 PERMISSION_GRANTED ,否则返回 PERMISSION_DENIED

若返回了 PERMISSION_DENIED ,那么我们就要去申请该权限了。这时就要用到 Activity.requestPermissions(String[] permissions, int requestCode) 这个方法了。顾名思义,该方法的作用就是申请某些权限了。第一个参数就是要申请的权限,可以看到参数形式是一个数组,也就是说可以一次申请多个权限。而第二个参数就是申请权限的代号,主要用于在之后的回调中选择。

当用户在权限申请的对话框中作出选择后,就会回调 onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 方法。

     第一个参数就是上面的权限代号;

     第二个参数是申请的权限数组;

     第三个参数就是权限申请的结果。

结合上面的几个方法,可以写出如下所示的权限申请代码模版:

public static final int READ_CONTACTS_REQUEST_CODE = 101;

// 如果权限没有被授予
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) !=
 PackageManager.PERMISSION_GRANTED) {
 // 申请权限
 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE);
} else {
 // TODO 权限已经被授予

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 switch (requestCode) {
 case READ_CONTACTS_REQUEST_CODE:
  if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  // TODO 用户已经授予了权限

  } else {
  // TODO 用户拒绝授予权限

  }
  break;
 }

}

在这里,还有一个方法需要注意下,那就是 shouldShowRequestPermissionRationale (Activity activity, String permission) 方法。这个方法的作用就是当用户拒绝了某个权限之后,下一次就会显示出需要该权限的说明。

关于运行时申请权限基本就这样了,值得提醒的是,并不是所有的权限都需要运行时申请,只有“危险”的权限才通过运行时来申请。比如说读取联系人、获取位置信息、读写SD卡等等都为“危险权限”,而比如振动、联网、蓝牙等就是普通权限了,就不需要运行时申请了。

说完了运行时申请权限后,另外还有一点需要注意的是,在 Android 6.0 显示悬浮窗也有一个“坑”。如果调用平常的显示悬浮窗的方法,会抛出 “permission denied for this window type” 异常。解决的方案就是在显示悬浮窗之前,需要调用一下 Settings.canDrawOverlays(context) 这个方法。若该方法返回 true ,则说明用户同意创建悬浮窗;否则可以跳转到相关的设置页面。具体的代码模版如下:

if (Build.VERSION.SDK_INT >= 23) {
 if (Settings.canDrawOverlays(context)) {
 // 显示悬浮窗
 } else {
 // 跳转到相关的设置页面
 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
 startActivity(intent);
 }
} else {
 // 版本低于Android 6.0,直接显示悬浮窗
}

总结

好了,就到这里吧,以上就是Android6.0运行时的权限处理的全部问题,希望这篇文章对大家开发Android能有所帮助。

相关文章

  • RecyclerView索引溢出异常的解决方法

    RecyclerView索引溢出异常的解决方法

    本篇文章主要介绍了RecyclerView索引溢出异常的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Android开发实现文件存储功能

    Android开发实现文件存储功能

    这篇文章主要为大家详细介绍了Android开发实现文件存储功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Kotlin server多线程编程详细讲解

    Kotlin server多线程编程详细讲解

    这篇文章主要介绍了Kotlin server多线程编程,Service是实现程序后台运行的解决方案,适合执行非交互,后台预先的任务,即使用户打开其他应用,Service也能够正常运行
    2023-01-01
  • Android中操作SQLite数据库快速入门教程

    Android中操作SQLite数据库快速入门教程

    这篇文章主要介绍了Android中操作SQLite数据库快速入门教程,本文讲解了数据库基础概念、Android平台下数据库相关类、创建数据库、向表格中添加数据、从表格中查询记录等内容,需要的朋友可以参考下
    2015-03-03
  • Android仿微信/支付宝密码输入框

    Android仿微信/支付宝密码输入框

    这篇文章主要介绍了Android仿微信/支付宝密码输入框的相关资料,需要的朋友可以参考下
    2015-12-12
  • Android自定义动画根据控件Y轴旋转动画(仿红包)

    Android自定义动画根据控件Y轴旋转动画(仿红包)

    这篇文章主要介绍了Android自定义动画根据控件Y轴旋转动画(仿红包),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Android实现平滑翻动效果

    Android实现平滑翻动效果

    这篇文章主要为大家详细介绍了Android实现平滑翻动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Android Studio多渠道打包、自定义打包APK名称

    Android Studio多渠道打包、自定义打包APK名称

    Android Studio为我们提供了简便的方法,可以多渠道打包,一次打包所有的渠道包。这篇文章主要介绍了Android Studio多渠道打包、自定义打包APK名称,需要的朋友可以参考下
    2018-01-01
  • Android View刷新机制实例分析

    Android View刷新机制实例分析

    这篇文章主要介绍了Android View刷新机制,结合实例形式较为详细的分析了Android的View刷新机制功能、原理与具体使用技巧,需要的朋友可以参考下
    2016-02-02
  • TextView长按复制的实现方法(总结)

    TextView长按复制的实现方法(总结)

    下面小编就为大家带来一篇TextView长按复制的实现方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04

最新评论