介绍
Android 应用必须请求访问敏感用户数据(例如联系人和短信)或某些系统功能(例如相机和互联网访问)的权限。每个权限都由一个唯一的标签标识。例如,需要发送 SMS 消息和访问互联网的应用程序必须在清单中包含以下内容:
<manifest ... > <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.INTERNET" /> ... </manifest>
添加自定义权限,如:
<manifest ... > <uses-permission android:name="com.scc.userprovider.permissionread"/> <uses-permission android:name="com.scc.userprovider.permissionwrite"/> ... </manifest>
权限不仅用于请求系统功能。你还可以限制其他应用与你的应用组件交互的方式。如何自定义权限请往下看。
官方权限大全
站内权限大全
permission(自定义权限)
介绍
你的应用可以使用 声明安全权限,可用于限制对此应用或其他应用的特定组件或功能的访问,例如 ContentProvider。
<permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | ...] />
android:description:权限说明。此属性必须设置为对字符串资源的引用。
例如:
<permission android:description="哈哈可读说明" .../>
报错:AAPT: error: '哈哈可读说明' is incompatible with attribute description (attr) reference.
- android:icon:权限的图标。
- android:label:向用户显示的权限的名称。可将此标签直接设置为原始字符串。不过,当准备好发布应用时,应将标签设置为对字符串资源的引用,以便可以像界面中的其他字符串一样进行本地化。
- android:name:用于引用权限的名称。(例如,在元素和应用组件的 permission 属性中)
- android:permissionGroup:将此权限分配给一个组。如果未设置此属性,则此权限不会属于某个组。
- android:protectionLevel: 说明权限中隐含的潜在风险,并指示系统在确定是否将权限授予请求授权的应用时应遵循的流程。下表列出了所有基本权限类型。
- normal:默认值。具有较低风险的权限。系统会自动向在安装时请求授权的应用授予此类权限,无需征得用户的明确许可(但用户始终可以选择在安装之前查看这些权限)。
- dangerous:具有较高风险的权限。由于此类权限会带来潜在风险,因此系统可能不会自动向请求授权的应用授予此类权限。
- signature 只有在请求授权的应用使用与声明权限的应用相同的证书进行签名时系统才会授予的权限。如果证书匹配,则系统会在不通知用户或征得用户明确许可的情况下自动授予权限。
- signatureOrSystem:不要使用此选项,因为 signature 保护级别应足以满足大多数需求,无论应用安装在何处,该保护级别都能正常发挥作用。signatureOrSystem权限适用于以下特殊情况:多个供应商将应用内置到一个系统映像中,并且需要明确共享特定功能,因为这些功能是一起构建的。
permission样例
应用Demo(com.scc.cp)和其他应用(com.scc.ha)
1.先使用定义一个权限
<permission android:description="@string/permission_description" android:icon="@mipmap/ic_launcher" android:label="permissionLabel" android:name="com.scc.userprovider.permission" android:protectionLevel="normal"/>
2.provider组件设置权限
<provider android:authorities="com.scc.userprovider" android:name="com.scc.cp.UserProvider" android:permission="com.scc.userprovider.permission" android:exported="true"/>
3.其他应用(com.scc.ha)使用com.scc.cp包加权限的UserProvider
啥也不做直接操作:
Process: com.scc.ha, PID: 14922 java.lang.SecurityException: Permission Denial: opening provider com.scc.cp.UserProvider from ProcessRecord{5d7db58 14922:com.scc.ha/u0a889} (pid=14922, uid=10889) requires com.scc.userprovider.permission or com.scc.userprovider.permission
报错显示缺少com.scc.userprovider.permission权限
缺少权限,咱就申请权限:
<uses-permission android:name="com.scc.userprovider.permission"/>
然后就可以美滋滋的使用com.scc.cp包中的provider数据了。
permission官方文档
permission-group(自定义权限组)
介绍
<permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" />
声明相关权限的逻辑分组的名称。各个权限通过 元素的 permissionGroup 属性加入权限组中。权限组中的成员一起显示在界面中。
注意:此元素并不声明权限本身,而只声明可以放置权限的类别。
permission-group属性介绍跟permission类似,就不多做介绍了。
permission-group样例
应用Demo(com.scc.cp)和其他应用(com.scc.ha)
1.先使用定义一个权限组
<permission-group android:name="com.scc.userprovider.permissiongroup" android:description="@string/userprovider_permission_group_description" android:icon="@mipmap/ic_launcher" android:label="GroupLabel"/>
2.添加组员
<permission android:name="com.scc.userprovider.permissionread" android:description="@string/userprovider_permission_read_description" android:icon="@mipmap/ic_launcher" android:label="readLabel" android:permissionGroup="com.scc.userprovider.permissiongroup" android:protectionLevel="normal"/> <permission android:name="com.scc.userprovider.permissionwrite" android:description="@string/userprovider_permission_write_description" android:icon="@mipmap/ic_launcher" android:label="writeLabel" android:permissionGroup="com.scc.userprovider.permissiongroup" android:protectionLevel="normal"/>
3.provider组件设置权限
<provider android:authorities="com.scc.userprovider" android:name="com.scc.cp.UserProvider" android:writePermission="com.scc.userprovider.permissionwrite" android:readPermission="com.scc.userprovider.permissionread" android:exported="true"/>
4.其他应用(com.scc.ha)使用com.scc.cp包加权限的UserProvider
啥也不做直接操作同样会报上面缺少权限的错误。
咱们先申请权限
<uses-permission android:name="com.scc.userprovider.permissionread"/> <uses-permission android:name="com.scc.userprovider.permissionwrite"/>
然后就可以美滋滋的使用com.scc.cp包中的provider数据了。
permission-group官方文档
齐活,哪里有问题,欢迎指导。