公司业务需要与公司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 的描述
⤧  Next post RxJava简单入门 ⤧  Previous post EditText通过设置TextWatcher,禁止不符合要求字符输入