android <permission> 和 <uses-permission>

本文详细解释了AndroidManifest.xml中<permission>标签用于定义新权限以保护应用组件,以及<uses-permission>标签用于请求系统权限。重点讨论了protectionLevel属性及其在权限管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

`<permission>` 和 `<uses-permission>` 标签在 AndroidManifest.xml 文件中分别用于不同的目的:

1. `<permission>` 标签:
   - 作用:**定义一个新的权限**,这个权限是由你的应用程序创建并拥有的,通常是为了保护应用程序内部的一部分组件(如 ContentProvider、BroadcastReceiver 或 Service)不被未经授权的其他应用程序随意访问。
   - 示例:当你希望限制其他应用对你的应用特定资源或服务的访问时,你需要通过 `<permission>` 标签来声明一个自定义权限,并设置相应的属性,比如 `android:name`、`android:protectionLevel` 等。

2. `<uses-permission>` 标签:
   - 作用:**请求已存在的权限**,即声明应用在运行时需要访问哪些由 Android 系统或者其他应用定义的权限。
   - 示例:如果你的应用需要访问用户的联系人、发送短信、获取网络状态等,那么在 Manifest 中使用 `<uses-permission>` 标签来声明对这些预定义系统权限的需求,比如 `READ_CONTACTS`、`SEND_SMS` 或 `ACCESS_NETWORK_STATE` 等。

总结起来:
- `<permission>` 是为了**定义和保护**你的应用中的功能而使用的,让其他应用必须先获得授权才能使用这些功能。
- `<uses-permission>` 则是你的应用向系统表明它**需要何种权限才能正常运行**,这些权限通常是系统已经定义好的标准权限或其他应用定义的自定义权限。

以下是一个 `<permission>` 标签在 AndroidManifest.xml 中定义自定义权限的例子

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <!-- 定义一个自定义权限 -->
    <permission android:name="com.example.myapp.permission.ACCESS_MY_DATA"
        android:label="@string/permlab_accessMyData"
        android:description="@string/permdesc_accessMyData"
        android:protectionLevel="signature" />

    <application ...>
        <!-- 其他应用组件声明 -->

        <!-- 使用 ContentProvider 并且要求其他应用拥有此权限才能访问 -->
        <provider
            android:name=".MyContentProvider"
            android:authorities="com.example.myapp.provider"
            android:exported="true"
            android:permission="com.example.myapp.permission.ACCESS_MY_DATA" />
    </application>

</manifest>
```

在这个例子中,我们定义了一个名为 "com.example.myapp.permission.ACCESS_MY_DATA" 的自定义权限,设置了其描述和标签。然后,在定义的 ContentProvider 中,我们通过 `android:permission` 属性指定了只有具有该权限的应用才能访问此 ContentProvider。这里的 `android:protectionLevel="signature"` 表示只有与声明此权限的应用具有相同证书签名的应用才能获得此权限。

`protectionLevel` 是在 Android `<permission>` 标签中定义的一个属性,用于指定权限的安全级别。不同级别的 protectionLevel 决定了授予该权限所需的条件以及用户界面提示信息的不同。以下是几种常见的 protectionLevel 类型:

1. **normal**:
   - 默认值,表示普通权限,安装时自动授予。对于此类权限,用户无法在安装后单独撤销。

2. **dangerous**:
   - 对于可能影响用户隐私或者设备操作的权限,例如读取通讯录、发送短信、访问摄像头等,Android 6.0(API 级别 23)及以上版本会要求在运行时动态申请并征得用户同意。低于 API 23 的版本则在安装时一并授予。

3. **signature**:
   - 只有与声明该权限的应用具有相同证书签名的应用才能获得此权限。例如,如果一个应用定义了一个 signature 级别的权限,那么只有来自同一开发者的其他应用可以请求并获得这个权限。

4. **signatureOrSystem**:
   - 与 signature 类似,但除了同签名的应用外,还允许预装在系统分区上的应用获取该权限。

5. **privileged**:
   - 仅适用于系统应用,表示需要特殊权限的应用,例如访问硬件识别码、修改系统设置等。

6. **development**:
   - 仅供开发者在开发阶段使用的权限,不应出现在发布到 Play 商店或其他分发渠道的应用中。

根据应用的具体需求和安全策略选择合适的 protectionLevel 是非常重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值