使用系统权限

为了保护系统的完整性和用户隐私权,Android 在访问受限的沙盒中运行每款应用。如果应用需要使用其沙盒以外的资源或信息,则必须明确请求权限。根据应用请求的权限类型,系统可能会自动授予权限,也可能会要求用户授予权限。

向清单添加权限

要声明您的应用需要权限,请将 元素置于您的应用清单中,作为顶级 元素的子项。例如,需要发送短信的应用可在清单中添加以下代码行:

<manifest xmlns:android=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
package=<span class="hljs-string">"com.example.snazzyapp"</span>> <uses-permission android:name=<span class="hljs-string">"android.permission.SEND_SMS"</span>/> <application <span class="hljs-keyword">...</span>>
<span class="hljs-keyword">...</span>
</application> </manifest>
`</pre> 系统在您声明权限之后的行为取决于权限的敏感性。如果权限不影响用户隐私权,系统会自动授权。如果权限可能涉及对敏感用户信息的访问,系统将要求用户审批请求。要了解有关不同种类权限的详细信息,请参阅正常权限和危险权限。 ### 检查权限 如果您的应用需要危险权限,则每次执行需要这一权限的操作时您都必须检查自己是否具有该权限。用户始终可以自由调用此权限,因此,即使应用昨天使用了相机,它不能假设自己今天仍具有该权限。 要检查您是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,以下代码段显示了如何检查 Activity 是否具有在日历中进行写入的权限: <pre>`<span class="hljs-comment">// Assume thisActivity is the current activity</span>
<span class="hljs-keyword">int</span> permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
`</pre> 如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PERMISSION_DENIED,且应用必须明确向用户要求权限。 ### 请求权限 如果您的应用需要应用清单中列出的危险权限,那么,它必须要求用户授予该权限。Android 为您提供了多种权限请求方式。调用这些方法将显示一个标准的 Android 对话框,不过,您不能对它们进行自定义。 如果应用尚无所需的权限,则应用必须调用一个 requestPermissions() 方法,以请求适当的权限。应用将传递其所需的权限,以及您指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到 requestPermissions()。 以下代码可以检查应用是否具备读取用户联系人的权限,并根据需要请求该权限: <pre>`<span class="hljs-comment">// Here, thisActivity is the current activity</span>
<span class="hljs-keyword">if</span> (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) { <span class="hljs-comment">// Should we show an explanation?</span>
<span class="hljs-keyword">if</span> (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) { <span class="hljs-comment">// Show an expanation to the user *asynchronously* -- don't block</span>
<span class="hljs-comment">// this thread waiting for the user's response! After the user</span>
<span class="hljs-comment">// sees the explanation, try again to request the permission.</span> } <span class="hljs-keyword">else</span> { <span class="hljs-comment">// No explanation needed, we can request the permission.</span> ActivityCompat.requestPermissions(thisActivity,
<span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS); <span class="hljs-comment">// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an</span>
<span class="hljs-comment">// app-defined int constant. The callback method gets the</span>
<span class="hljs-comment">// result of the request.</span>
}
}
`</pre><pre>`注:当您的应用调用 <span class="hljs-function"><span class="hljs-title">requestPermissions</span><span class="hljs-params">()</span></span> 时,系统将向用户显示一个标准对话框。您的应用无法配置或更改此对话框。如果您需要为用户提供任何信息或解释,您应在调用 <span class="hljs-function"><span class="hljs-title">requestPermissions</span><span class="hljs-params">()</span></span> 之前进行,如解释应用为什么需要权限中所述。
`</pre> ### 处理权限请求响应 当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。例如,如果应用请求 READ_CONTACTS 访问权限,则它可能采用以下回调方法: <pre>`<span class="hljs-annotation">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onRequestPermissionsResult</span><span class="hljs-params">(<span class="hljs-keyword">int</span> requestCode,
String permissions[], <span class="hljs-keyword">int</span>[] grantResults)</span> </span>{
<span class="hljs-keyword">switch</span> (requestCode) {
<span class="hljs-keyword">case</span> MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
<span class="hljs-comment">// If request is cancelled, the result arrays are empty.</span>
<span class="hljs-keyword">if</span> (grantResults.length > <span class="hljs-number">0</span>
&& grantResults[<span class="hljs-number">0</span>] == PackageManager.PERMISSION_GRANTED) { <span class="hljs-comment">// permission was granted, yay! Do the</span>
<span class="hljs-comment">// contacts-related task you need to do.</span> } <span class="hljs-keyword">else</span> { <span class="hljs-comment">// permission denied, boo! Disable the</span>
<span class="hljs-comment">// functionality that depends on this permission.</span>
}
<span class="hljs-keyword">return</span>;
} <span class="hljs-comment">// other 'case' lines to check for other</span>
<span class="hljs-comment">// permissions this app might request</span>
}
}
`</pre> 系统显示的对话框说明了您的应用需要访问的权限组;它不会列出具体权限。例如,如果您请求 READ_CONTACTS 权限,系统对话框只显示您的应用需要访问设备的联系人。用户只需要为每个权限组授予一次权限。如果您的应用请求该组中的任何其他权限(已在您的应用清单中列出),系统将自动授予应用这些权限。当您请求此权限时,系统会调用您的 onRequestPermissionsResult() 回调方法,并传递 PERMISSION_GRANTED,如果用户已通过系统对话框明确同意您的权限请求,系统将采用相同方式操作。 <pre>`注:您的应用仍需要明确请求其需要的每项权限,即使用户已向应用授予该权限组中的其他权限。此外,权限分组在将来的 Android 版本中可能会发生变化。您的代码不应依赖特定权限属于或不属于相同组这种假设。

例如,假设您在应用清单中列出了 READ_CONTACTS 和 WRITE_CONTACTS。如果您请求 READ_CONTACTS 且用户授予了此权限,那么,当您请求 WRITE_CONTACTS 时,系统将立即授予您该权限,不会与用户交互。

如果用户拒绝了某项权限请求,您的应用应采取适当的操作。例如,您的应用可能显示一个对话框,解释它为什么无法执行用户已经请求但需要该权限的操作。

当系统要求用户授予权限时,用户可以选择指示系统不再要求提供该权限。这种情况下,无论应用在什么时候使用 requestPermissions() 再次要求该权限,系统都会立即拒绝此请求。系统会调用您的 onRequestPermissionsResult() 回调方法,并传递 PERMISSION_DENIED,如果用户再次明确拒绝了您的请求,系统将采用相同方式操作。这意味着当您调用 requestPermissions() 时,您不能假设已经发生与用户的任何直接交互。

参考资料:

官方文档(中文版)Working with System Permissions

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

Android权限管理的更多相关文章

  1. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  2. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  3. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  4. android: Android 权限管理小结

    一. 概述 感谢郭神,自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有 ...

  5. Android权限管理知识学习记录

    一.Android权限背景知识 在Android 6.0之前,所申请的权限只需要在AndroidManifest.xml列举就可以了,从而容易导致一些安全隐患,因此,在Android 6.0时,Goo ...

  6. Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用

    PermissionsDispatcher2.3.2使用 Android6.0权限官网https://developer.android.com/about/versions/marshmallow/ ...

  7. Android 权限管理(持续整理)

    1. Android 6.0之后,APP可以直接安装,运行时再询问用户授予相关权限,此时系统弹出一个对话框,(这个对话框不能由开发者定制) 同时用户也可以在手机的“设置”中对于某个App进行权限管理 ...

  8. Android 权限管理

    从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予.此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限.它还让用户可以对应 ...

  9. android 权限管理和签名 实现静默卸载

    为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android ...

随机推荐

  1. <亲测>CentOS7yum安装PHP7.2

    如果之前已经安装我们先卸载一下 yum -y remove php* 由于linux的yum源不存在php7.x,所以我们要更改yum源 rpm -Uvh https://dl.fedoraproje ...

  2. elasticsearch 口水篇(9)Facet

    FACET 1)Terms Facet { "query" : { "match_all" : { } }, "facets" : { &q ...

  3. 利用cbmakegen导出Code::blocks的Makefile

    首先到官网下载cbmakegen 官网地址:http://developer.berlios.de/projects/cbmakegen/ 也可通过我的百度网盘下载 [windows版本]地址:htt ...

  4. 写在vue总结之前(一)

    在大概2016年6月吧,知道了vue,博客园有个博主用vue写了一个不算完整的博客园app,做出来的效果相比博客园原本的app看上去要华丽很多,那时候做前端还没多久,很多东西都不知道,别人说用vue开 ...

  5. whith ~ as 用法

    个人理解 with self.client.get("/", catch_response=True) as response: 其实就是 response = self.clie ...

  6. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  7. Java中的局部变量、成员变量和静态变量

    直接看代码 public class Variable { // 静态变量,属于类的变量,且用关键字static声明,不属于实例,虽然可以通过实例来调用,但是不建议 private static in ...

  8. [UE4]不精准射击 Random Unit Vector in Cone in Radians

  9. [UE4]Make Array创建数组,而不是定义数组

    当不想新建一个数组对象的时候,就可以使用“Make Array”创建一个数组

  10. @postconstruct初始化的操作(转载)

    原文地址:https://www.cnblogs.com/qingruihappy/p/7861623.html 从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注 ...