Android权限管理

一、自定义权限

1、自定义权限的作用

自定义权限,一般是考虑到应用共享组件时的安全问题。我们知道在四大组件 AndroidManifest中注册的时候,添加 exported = "true" 属性,这样就可以使其被其他 App 所调用。但是我们希望只有被允许的App才能调用,这个时候可以考虑使用”自定义权限“来实现。我们定义提供组件的App为开放端,使用开放组件的App为接入端,用这两个概念来描述自定义权限。

2、怎么自定义权限

1). 开放端:在 AndroidManifest 的 manifest 节点下定义权限:

<permission
   android:name="com.sl.permission.aidl"
   android:description="@string/service_permission"
   android:permissionGroup="com.sl.permissions"
   android:protectionLevel="signature" />

a、name : 权限名称

b、description : 权限描述

c、permissionGroup : 指定权限属于的权限组

d、protectionLevel : 权限保护级别。可以是以下值:

normal:这是最低风险的权限,如果应用声明了此权限,也不会提示安装应用的用户授权(例如,如果声明了定位权限,则应用到定位功能时,会明确提示用户,是否授予定位权限,但是protectionLevel为normal的不会明确提示,直接默认授予),系统直接默认该应用有此权限;

dangerous:这种级别的权限风险更高,拥有此权限可能会访问用户私人数据或者控制设备,给用户带来负面影响,这种类型的权限一般不会默认授权。

signature:这种权限级别,只有当发请求的应用和接收此请求的应用使用同一签名文件,并且声明了该权限才会授权,并且是默认授权,不会提示用户授权

signatureOrSystem:这种权限级别是系统授权的系统应用或者相同签名的应用,一般避免使用该级别,因为 signature 已经能满足大部分需求。

2)、开放组件:添加 permission 属性为自定义的权限,在组件的AndroidManifest 文件中添加android:permission属性

<service
      android:name=".BookManagerService"
      android:permission="com.permission.aidl"
      android:exported="true">
      <intent-filter>
          <action android:name="com.demo.aidl" />
          <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
<Service/>

3)、接入端:在 AndroidManifest 的 manifest 节点下使用自定义权限

<uses-permission android:name="com.permission.aidl" />

3、在Activity中使用自定义权限

1)、在被调用Activity所在项目的AndroidManifest 声明自定义权限

<permission android:name="com.permisson_activity"/>

2)、在被调用Activity的AndroidManifest 中使用android:permission属性设置权限

<activity
    android:name=".launch_mode.LaunchStandard1Activity"
    android:exported="true"
    android:launchMode="standard"
    android:permission="com.permisson_activity"/>
<activity

3)、在调用端的AndroidManifest中添加权限

<uses-permission android:name="com.permisson_activity"/>

如果不添加该权限,调用Activity时会报权限错误。

java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.demo.activity/.launch_mode.LaunchStandard1Activity } from ProcessRecord{29852ce 3339:com.demo.anotherappactivity/u0a68} (pid=3339, uid=10068) requires com.permisson_activity

4)、在调用端启动Activity

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.demo.activity", "com.demo.activity.launch_mode.LaunchStandard1Activity"));
startActivity(intent);

4、在Service中使用自定义权限

Service中使用和Activity中使用一样,bindService和startService使用时一样的。

5、在BroadcastReceive中使用自定义权限

1)、谁有权限收我的广播

a、在发送广播时指定需要的权限

intent = new Intent();
intent.setAction("com.otherapp.receive");
sendBroadcast(intent, "com.permission.recv");

com.permission.recv就是权限,可以在AndroidManifest中声明,也可以不在AndroidManifest中声明

b、在需要接受该广播的Receive所在项目的AndroidManifest中添加权限

<uses-permission android:name="com.permission.recv"/>

2)、谁有权限给我发广播

a、在接受者所在项目的AndroidManifest中声明权限

<permission android:name="com.permission.send"/>

b、在接受者的AndroidManifest中添加权限,使用android:permission属性

<receiver
    android:name=".OtherAppReceiver"
    android:enabled="true"
    android:exported="true"
    android:permission="com.permission.send">
    <intent-filter>
        <action android:name="com.otherapp.receive"></action>
    </intent-filter>
</receiver>

c、在发送广播的项目AndroidManifest中添加权限

<uses-permission android:name="com.permission.send"/>

d、发送广播

intent = new Intent();
intent.setAction("com.otherapp.receive");
sendBroadcast(intent);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值