Android 16 关于动态权限使用的变更
权限声明code
在 Android 中,权限的申请分为静态权限和动态权限。
静态权限
静态权限是指在应用的 AndroidManifest.xml 文件中声明的权限。这些权限在应用安装时就会被用户授予。常见的静态权限包括访问互联网、读取用户联系人等。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 这种要特定系统app才能声明,不然运行时报错 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest>
动态权限
动态权限是指在运行时请求用户授权的权限。这种权限机制从 Android 6.0(API 23)开始引入。用户可以在运行时选择是否授予应用某些权限。
申请动态权限的步骤:
- 检查权限:在请求权限之前,先检查是否已经获得了该权限。
- 请求权限:如果权限未被授予,则请求该权限。
- 处理权限请求结果:用户作出响应后,需要处理权限请求的结果。
// 检查权限
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// 如果没有权限,则请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
} else {
// 已经获得权限,可以执行相关操作
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions,
int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予
} else {
// 权限被拒绝
}
break;
}
}
Google 变更说明
- Google 对权限树和动态权限的支持将被废弃,将在Android 16(25Q2)中弃用相关API,如果没有人使用这些API,Google 可能也会在25Q2中将这些API变为无操作。
- Google 鼓励开发者在应用程序清单中静态声明他们的权限,而不是动态定义权限。
Google will deprecate the some related APIs of permission trees and dynamic in Android 16 (25Q2).
APP list as below:
- PackageManager#addPermission
- PackageManager#addPermissionAsync
- PackageManager#removePermission
Google Suggetion: developers to declare their permissions statically inside their app manifest.