本文章适合于进行Android开发的工作人员或者爱好者。若有不正确的地方,欢迎指正。
很多进行Android应用开发的人都有这样子的疑惑,为什么应用访问联系人或者获取设备位置信息等都需要先动态申请对应的权限然后用户点击同意之后才能正常访问。其实,AndroidO之后(targetSDK大于等于23),Android系统引入了运行时权限的概念,应用访问某些特定功能需要先动态申请运行时权限并且取得用户授权才能够成功访问,否则系统将抛出异常,若应用没有捕获异常,应用将崩溃。
那么,Android上到底有哪些是运行时权限?对此,这里推荐一个Android源码查看网站:http://androidxref.com/,国内也能正常访问。http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/res/AndroidManifest.xml文件里面定义了Android9.0上所有原生的权限信息(是不是觉得AndroidManifest.xml非常熟悉,是的,自己写的应用也可以在对应的AdroidManifest.xml文件里面自定义权限)。举个例子:查看读联系人信息的权限:
<!-- Allows an application to read the user's contacts data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CONTACTS"
android:permissionGroup="android.permission-group.CONTACTS"
android:label="@string/permlab_readContacts"
android:description="@string/permdesc_readContacts"
android:protectionLevel="dangerous" />
name表示权限的名称。permissionGroup表示权限的组别,这里表示读联系人的权限属于联系人权限组。label表示权限的标签(我不知道翻译为标签是否合适),可以在string.xml里面添加对各种语言。description表示对权限描述,可以用来描述权限的作用。Protection level表示权限级别,normal表示普通权限,即应用在manifest里面声明使用这个权限系统就默认给应用这个权限;dangerous表示危险权限,即需要应用动态申请该权限并且用户明确授权之后系统才能给与应用授权。当然,权限级别还有signature以及privileged级别等,后续会慢慢讲到这些。
本章内容就到这里,下一章我们将一个应用动态申请危险权限的流程,权限弹框到底是哪里弹出来,以及为什么用户点击同意之后系统会给应用进行权限。