`<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 是非常重要的。