最近忽然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无心,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总以为生活中少了点什么,因此想着围绕着最近面试过程当中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,因此选择先去了解一下Android的Permission权限机制及使用html
权限管理相关博客:java
权限是一种安全机制。Android权限主要用于限制应用程序内部某些具备限制性特性的功能使用以及应用程序之间的组件访问。android
Android权限列表能够参考这篇博客:android权限大全面试
<uses-permission android:name="string"/>
例如申请使用网络权限sql
<uses-permission android:name="android.permission.INTERNET"/>
若是特定的权限必须申明使用,若是没有申请使用就会报出Permission Denial错误,例如访问通信录报出以下错误安全
Caused by: java.lang.SecurityException: Permission Denial: reading com.androintacts.ContactsProvider2 uri content://contacts/data/phones from pid=23763, uid=10036 requires android.permission.READ_CONTACTS
解决此类错误咱们只需根据提示添加对应的权限便可网络
<uses-permission android:name="android.permission.READ_CONTACTS" />
虽然这种使用场景很少见,可是在有些特定的场景下出于安全考虑就须要自定义权限了,好比两个APP之间须要共享数据而采用了ContentProvider,此时咱们须要对一个app访问另一个app的数据时须要添加权限申请。自定义权限经过<permission>标签app
<permission android:description=”string resource” android:icon=”drawable resource” android:label=”string resource” android:name=”string” android:permissionGroup=”string” android:protectionLevel=[“normal” | “dangerous” | “signature” | “signatureOrSystem”] />
android:description:对权限的描述,比lable更加的详细,介绍该权限的相关使用状况,好比当用户被询问是否给其余应用该权限时。注意描述应该使用的是string资源,而不是直接使用string串。 ide
android:icon:用来标识该权限的一个图标。post
android:label:权限的一个给用户展现的简短描述。方便的来讲,这个能够直接使用一个string字串来表示,可是若是要发布的话,仍是应该使用string资源来表示。
android:name:权限的惟一名字,因为独立性,通常都是使用包名加权限名,该属性是必须的,其余的可选,未写的系统会指定默认值。
android:permissionGroup: 权限所属权限组的名称,而且须要在这个或其余应用中使用<permission-group>标签提早声明该名称,若是没有声明,该权限就不属于该组。
android:protectionLevel:权限的等级
关于android:protectionLevel:权限的等级
normal 低风险权限,只要申请了就可使用(在AndroidManifest.xml中添加<uses-permission>标签),安装时不须要用户确认;
dangerous 高风险权限,安装时须要用户的确认才可以使用;
signature 只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(若是是申请系统权限,则须要与系统签名相同),才能将权限授给它;
signatureOrSystem 签名相同,或者申请权限的应用为系统应用(在system image中),与signature相似,只是增长了rom中自带的app的声明 ,尽可能不要使用该选项,由于signature已经适合绝大部分的状况。
对于普通和危险级别的权限,咱们称之为低级权限,应用申请即授予。其余两级权限,咱们称之为高级权限或系统权限。当应用试图在没有权限的状况下作受限操做,应用将被系统杀掉以警示。系统应用可使用任何权限。权限的声明者可无条件使用该权限。
根据上面的介绍咱们实战一下自定义权限以下
<permission android:name="personprovider.permission.read" android:description="@string/personprovider_permission_read_desstring" android:icon="@mipmap/ic_launcher" android:label="@string/personprovider_permission_read_labestring" android:protectionLevel="normal"/> <permission android:name="personprovider.permission.write" android:description="@string/personprovider_permission_write_desstring" android:icon="@mipmap/ic_launcher" android:label="@string/personprovider_permission_write_labestring" android:protectionLevel="normal"/>
为了方便管理某一特定功能的权限,因此我会对权限进行分组,这时咱们须要经过<permission-group>自定义一个权限组
<permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string"/>
android:description 这个属性用于给权限组定义一个用户可读的说明性文本。这个文本应该比标签更长、更详细。这个属性必需要引用一个字符串资源,跟label属性不同,它不可以使用原生的字符串。
android:icon 这个属性定义了一个表明权限的图标。这个属性要使用包含图片定义的可绘制资源来定义。
android:label 这个属性给权限组定义了一个用户可读的名称。为了开发方便,在开发时,能够直接使用原生的字符串来设置这个属性。可是,当应用程序正式发布时,应该使用字符串资源来设置,以便可以像用户界面中其余的字符串同样可以被本地化。
android:name 这个属性定义了权限组的名称,它是可以分配给<permission>元素的permissionGroup属性的名称。
上面的权限组咱们能够自定义为下面这种方式:
<permission-group android:name="personprovider.permission-group" android:description="@string/personprovider_permission_group_desstring" android:icon="@mipmap/ic_launcher" android:label="@string/personprovider_permission_group_labelstring"/> <permission android:name="personprovider.permission.read" android:description="@string/personprovider_permission_read_desstring" android:icon="@mipmap/ic_launcher" android:label="@string/personprovider_permission_read_labestring" android:permissionGroup="personprovider.permission-group" android:protectionLevel="normal"/> <permission android:name="personprovider.permission.write" android:description="@string/personprovider_permission_write_desstring" android:icon="@mipmap/ic_launcher" android:label="@string/personprovider_permission_write_labestring" android:permissionGroup="personprovider.permission-group" android:protectionLevel="normal"/>
其余关于permission-tree这里就不介绍了,这个至今没有用到过,<permission-tree>是为一组permissions声明了一个namespace。
申请权限
<uses-permission android:name="personprovider.permission.read"/> <uses-permission android:name="personprovider.permission.write"/>
在宿主上声明须要申请访问权限
<provider android:name=".PersonProvider" android:authorities="com.whoislcj.testsqlite.personprovider" android:enabled="true" android:exported="true" android:readPermission="personprovider.permission..read" android:writePermission="personprovider.permission..write"/>
本篇大体了解了Android的权限permission以及如何使用和自定义权限,下篇将总结学一下如何解决Android 6.0的权限的适配问题。