应用权限通过保护对以下内容的访问,帮助支持用户隐私:
受限数据,如系统状态和用户的联系信息。
受限操作,例如连接到配对设备和录制音频。
每个Android应用都运行在一个访问受限的sandbox中,如果您的应用程序需要使用其自身沙箱之外的资源或信息,您可以声明权限并设置提供此访问权限的权限请求。这些步骤是使用权限工作流的一部分。
比如说想要当前Android设备中正在运行的媒体会话的controller list,则需要申请权限:android.Manifest.permission.MEDIA_CONTENT_CONTROL
google源码中的下面文件定义了所有的权限:
/frameworks/base/core/res/AndroidManifest.xml
Eg:
<!-- Allows an application to know what content is playing and control its playback.
<p>Not for use by third-party applications due to privacy of media consumption</p> -->
<permission android:name="android.permission.MEDIA_CONTENT_CONTROL"
android:protectionLevel="signature|privileged" />
Android将权限分为不同的类型,包括安装时权限、运行时权限和特殊权限。每个权限的类型指明应用程序可以访问的受限数据的范围,以及系统授予应用程序该权限时应用程序可以执行的受限操作的范围。
“安装时间”权限允许应用程序对受限数据进行受限访问,并允许应用程序执行对系统或其他应用程序影响最小的受限操作。当您在应用程序中声明安装时权限时,系统会在用户安装应用程序时自动授予您的应用程序权限。当用户查看应用程序的详细信息页面时,应用程序商店会向用户显示安装时权限通知,如下图所示。
Android包括几个安装时权限的子类型,包括普通权限和签名权限。
这些权限允许访问扩展到应用程序沙箱之外的数据和操作。然而,这些数据和行为对用户隐私和其他应用程序的操作风险很小。
系统将“normal”保护级别(protection level )分配给正常权限
如果应用程序声明了另一个应用程序定义的签名权限,并且两个应用程序由同一证书签名,则系统会在安装时将该权限授予第一个应用程序。否则,无法授予第一个应用程序权限。也就是说,有相同签名的App可以访问和共享此权限
系统将“signature”保护级别(protection level )分配给签名权限
运行时权限(也称为危险权限)为应用程序提供对受限数据的额外访问权限,并允许应用程序执行对系统和其他应用程序有更大影响的受限操作。因此,在访问受限数据或执行受限操作之前,您需要在应用程序中请求运行时权限。当应用程序请求运行时权限时,系统会显示一个运行时权限提示,如下图所示。
许多运行时权限访问私有用户数据,这是一种特殊类型的受限数据,其中包含潜在的敏感信息。私人用户数据的示例包括位置和联系信息。
麦克风和摄像头可以访问特别敏感的信息。因此,系统会帮助您解释应用程序访问此信息的原因。
系统将“dangerous”保护级别分配给运行时权限
特殊权限对应于特定的应用程序操作。只有平台和OEM可以定义特殊权限。此外,当平台和原始设备制造商(OEM)想要保护对特别强大的操作的访问权限时,通常会定义特殊权限,例如在其他应用程序上绘图。
系统设置中的特殊应用程序访问页面包含一组用户可切换操作。其中许多操作是作为特殊权限实现的。
每个特殊权限都有自己的实现细节。
系统将“appop”保护级别分配给特殊权限。
所有的权限说明都可以参考permissions API reference page.
如果您声明了任何危险权限,并且您的应用程序安装在运行Android 6.0(API级别23)或更高版本的设备上,则必须按照本指南中的步骤在运行时请求危险权限。
如果您未声明任何危险权限,或者您的应用程序安装在运行Android 5.1(API级别22)或更低版本的设备上,则会自动授予权限,您无需完成此页面上的任何剩余步骤。
<manifest ...>
<uses-permission android:name="android.permission.CAMERA"/>
<application ...>
...
</application>
</manifest>
使用ContextCompat.checkSelfPermission() 检查当前应用是否已经有了权限,返回PERMISSION_GRANTED表示有权限,PERMISSION_DENIED表示没有权限。
如果是没有权限,则使用Activity自带的方法去申请。
具体可以参考Google提供的文档说明Request app permissions