Android自定义权限处理
公司业务需要与公司sdk 通信涉及到ContentProvider,对应用进行读写,使用到自定义权限。
Android权限类别
- normal,最常用。在AndroidManifest.xml中写入,默认申请。系统在安装时会自动授权。
- dangerous , 系统对此级别权限跟App 的targetSDKVersion 和系统api版本有关。当系统api版本或者targetSDKversion 低于23,会自动授予权限。在Android 6.0(23) 以后。由于更新了权限机制,使用dangerous权限,都需要动态授予权限
- signature ,当申请权限的app和定义权限的app使用的时同一签名时,系统自动授权,否则失败。同一个公司有多个app,且一个app需要调用另一个app 的组件 例如 contentprovider ,不希望被外部app 调用时,可以使用。
- signaturOrSystem,和signnature 类似,只是系统应用也能获取授权
遇到的问题
如果app B 申请 app A 的权限P ,如果app B是先安装的 A 是后安装的,那么会导致crash.解决方案是 B 也定义一个同样名字的权限即可(只需要定义权限的名字,label description protectionLevel 等不需要定义)
dangerous 权限在6.0以上不需要这样定义,因为权限都是动态授予的,但是在6.0以下 normal 和dangerous 都是一样处理的,因为都是安装的时候授权,因此如果app B 没有定义权限P ,那么在 6.0 以下的版本中,不能获取授权,解决方法同上,在app B 中定义权限P
app A
<permission
android:label="@string/dangerous_activity_permission_label"
android:description="@string/dangerous_activity_permission_desc"
android:protectionLevel="dangerous"
android:name="com.dlodlo.store.READ" />
app B
<!-- 自定义访问 softcontrolprovider 读权限 -->
<permission android:name="com.dlodlo.store.READ" />
这样定义之后,无论app A B 哪个先安装, app B 都能够获取权限。 在Android 6.0 上两者的安装顺序不同,表现也是不同的
- 如果先安装app A ,那么当app B 申请权限时,将会弹出授权框,因为再申请app A 的自定义权限
- 如果先安装app B 那么当app B申请授权时 将直接获取授权 不会弹框 因为它申请的是自己定义的权限 也就是说这种情况下 app A 实际是由app B 所定义的权限P 来保护的,所以如果要安装一个app C 那么再安装界面看到的实际上是ap B 的权限P 的描述