在Android开发中,权限是指应用程序需要访问特定的设备功能或数据时所需的用户许可。从Android 6.0(API级别23)开始,Android引入了运行时权限模型,在应用程序运行期间向用户请求权限,而不是在安装时请求。
举例手机外部读写和设备状态权限
1.Android 5.1(API级别22)及以下:
a.手机外部读写权限(WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE):
说明:在这些较旧的系统版本中,这些权限通常在应用安装时由用户授予,无需动态请求。
举例:您可以在应用的AndroidManifest.xml文件中声明这些权限,系统安装应用时会自动向用户请求授权。
b.设备状态权限(READ_PHONE_STATE):
说明:同样在应用安装时由用户授予。
举例:同样在AndroidManifest.xml文件中声明权限即可。
2.Android 6.010.0(API级别2329):
a.手机外部读写权限(WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE):
说明:在Android 6.0及以上版本中,这些权限属于危险权限,需要在运行时动态请求。
申请方法:您需要在应用程序运行时检查权限是否已经授予,如果没有授予,您需要向用户请求权限。例如:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 如果权限尚未授予,则请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_EXTERNAL_STORAGE_CODE);
}
b.设备状态权限(READ_PHONE_STATE):
说明:同样属于危险权限,在Android 6.0及以上版本中需要在运行时动态请求。
申请方法:与上述类似,您需要在运行时请求该权限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
// 如果权限尚未授予,则请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
REQUEST_READ_PHONE_STATE_CODE);
c.处理动态权限授权结果
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int p = 0; p < permissions.length; p++) {
Log.e(TAG,"permissions["+p+"] = " +permissions[p] +" , grantResults["+p+"] = " +grantResults[p] );
}
}
3.Android 11(API级别30)及以上:
a.手机外部读写权限(MANAGE_EXTERNAL_STORAGE):
在AndroidManifest.xml文件中声明权限:<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
动态申请:
boolean externalStorageManager = Environment.isExternalStorageManager();
用程序是否具有 MANAGE_EXTERNAL_STORAGE 权限,该权限可以管理外部存储空间:" + externalStorageManager
// 是否已获取权限
if (externalStorageManager == false) {
// 应用程序没有 MANAGE_EXTERNAL_STORAGE 权限,需要请求该权限
//申请所有文件访问权限
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
startActivityForResult(intent, ANDROID11_REQUEST_CODE);
}
网友评论