在Android Q中,可以通过使用REQUEST_LEGACY_EXTERNAL_STORAGE
权限来保持应用的权限状态,即使应用被卸载和重新安装。
下面是一个示例代码,演示如何使用REQUEST_LEGACY_EXTERNAL_STORAGE
权限:
final int REQUEST_CODE = 123; // 任意合适的请求码
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
// 如果设备运行的是Android Q及以上版本
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 如果WRITE_EXTERNAL_STORAGE权限尚未被授予
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}
} else {
// 如果设备运行的是Android Q以下版本
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 如果READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限尚未被授予
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}
}
onRequestPermissionsResult
方法中处理权限请求结果:@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
// 如果设备运行的是Android Q及以上版本
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 如果WRITE_EXTERNAL_STORAGE权限被拒绝
boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (!showRationale) {
// 如果用户选择了"不再询问"选项,弹出对话框引导用户手动开启权限
showPermissionDialog();
}
}
} else {
// 如果设备运行的是Android Q以下版本
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 如果READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限被拒绝
boolean showRationaleRead = shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE);
boolean showRationaleWrite = shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (!showRationaleRead && !showRationaleWrite) {
// 如果用户选择了"不再询问"选项,弹出对话框引导用户手动开启权限
showPermissionDialog();
}
}
}
}
}
以上代码会在设备运行的是Android Q及以上版本时,请求WRITE_EXTERNAL_STORAGE
权限。如果用户拒绝了此权限并选择了"不再询问"选项,将会弹出一个对话框引导用户手动开启权限。如果设备运行的是Android Q以下版本,则会请求READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
权限,并在相同的情况下弹出对话框引导用户开启权限。
请注意,Android Q之后,非系统应用无法直接访问外部存储的大部分路径,需要使用MediaStore API来操作外部存储中的文件。
上一篇:Android Q: java.io.FileNotFoundException: /proc/self/net/dev: open failed: EACCES(权限被拒绝)
下一篇:Android Q: 在使用Android中的气泡时出现错误 java.lang.NoSuchMethodError