权限声明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.