当前位置:   article > 正文

Android11及以上文件读写权限申请_android 文件读写权限

android 文件读写权限

Android11 读写权限申请

Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件读写权限。项目中 build.gradle 的targetSdkVersion >= 29 ,会出现读写问题。

targetSdkVersion = 29,通过设置requestLegacyExternalStorage=“true”,还能解决。

targetSdkVersion = 30后,需要申请所有文件权限才能获取到写入权限。

AndroidManifest添加权限设置

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  4. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
  5.         tools:ignore="ScopedStorage" /><!--add 2022-2-11 Android11-->
  6. <application
  7.     ...
  8.     android:requestLegacyExternalStorage="true"
  9.     ...
  10.     >

代码申请动态权限

1.Android 6.0之上Android11以下申请权限

  1. if (Build.VERSION.SDK_INT >= 23) {// 6.0
  2. String[] perms = {
  3. Manifest.permission.READ_EXTERNAL_STORAGE,
  4. Manifest.permission.WRITE_EXTERNAL_STORAGE,
  5. Manifest.permission.READ_PHONE_STATE};
  6. for (String p : perms) {
  7. int f = ContextCompat.checkSelfPermission(SafeKeyToolActivity.this, p);
  8. Log.d("---", String.format("%s - %d", p, f));
  9. if (f != PackageManager.PERMISSION_GRANTED) {
  10. requestPermissions(perms, 0XCF);
  11. break;
  12. }
  13. }
  14. }

Android11申请权限

跳转系统设置界面,用户授权获取权限。

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !isRefuse) {// android 11 且 不是已经被拒绝
  2. // 先判断有没有权限
  3. if (!Environment.isExternalStorageManager()) {
  4. Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
  5. intent.setData(Uri.parse("package:" + getPackageName()));
  6. startActivityForResult(intent, 1024);
  7. }
  8. }
  9. // 带回授权结果
  10. @Override
  11. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  12. super.onActivityResult(requestCode, resultCode, data);
  13. if (requestCode == 1024 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  14. // 检查是否有权限
  15. if (Environment.isExternalStorageManager()) {
  16. isRefuse = false;
  17. // 授权成功
  18. } else {
  19. isRefuse = true;
  20. // 授权失败
  21. }
  22. }
  23. }

对于部分手机如小米手机,即使获取了所有文件的管理权限,依旧访问不到Android/data目录,如图:

尝试解决办法:

只在外部存储的应用私有目录下,用直接路径读写文件。

访问或者共享媒体文件,使用MediaStore在公共目录下读写文件

访问或者共享非媒体文件,使用系统的文件选择器SAF在公共目录Download下读写文件。

根目录下可以创建自定义文件夹、文件。

补充:Android 11 及以上申请外部存储权限

升级 targetSdkVersion

  1. android
  2. defaultConfig {
  3. targetSdkVersion 30
  4. }
  5. }

添加清单权限

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

代码动态申请

  1. public final class PermissionActivity extends AppCompatActivity {
  2. private static final int REQUEST_CODE = 1024;
  3. @Override
  4. protected void onCreate(@Nullable Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. requestPermission();
  7. }
  8. private void requestPermission() {
  9. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  10. // 先判断有没有权限
  11. if (Environment.isExternalStorageManager()) {
  12. writeFile();
  13. } else {
  14. Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
  15. intent.setData(Uri.parse("package:" + context.getPackageName()));
  16. startActivityForResult(intent, REQUEST_CODE);
  17. }
  18. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  19. // 先判断有没有权限
  20. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
  21. ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
  22. writeFile();
  23. } else {
  24. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
  25. }
  26. } else {
  27. writeFile();
  28. }
  29. }
  30. @Override
  31. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  32. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  33. if (requestCode == REQUEST_CODE) {
  34. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
  35. ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
  36. writeFile();
  37. } else {
  38. ToastUtils.show("存储权限获取失败");
  39. }
  40. }
  41. }
  42. @Override
  43. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  44. super.onActivityResult(requestCode, resultCode, data);
  45. if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  46. if (Environment.isExternalStorageManager()) {
  47. writeFile();
  48. } else {
  49. ToastUtils.show("存储权限获取失败");
  50. }
  51. }
  52. }
  53. /**
  54. * 模拟文件写入
  55. */
  56. private void writeFile() {
  57. ToastUtils.show("写入文件成功");
  58. }
  59. }

转自:Android11及以上文件读写权限申请详细介绍_Android_脚本之家

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/794600
推荐阅读
相关标签
  

闽ICP备14008679号