XFilePermission.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package com.datarecovery.master.utils.xfile;
  2. import android.Manifest;
  3. import android.app.Activity;
  4. import android.content.ContentResolver;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.UriPermission;
  8. import android.content.pm.ApplicationInfo;
  9. import android.content.pm.PackageManager;
  10. import android.net.Uri;
  11. import android.os.Build;
  12. import android.os.storage.StorageVolume;
  13. import android.provider.DocumentsContract;
  14. import java.util.Arrays;
  15. import java.util.List;
  16. /**
  17. * 这个权限申请写的不好,看怎么根据业务需求优化
  18. */
  19. public class XFilePermission {
  20. private static final String[] EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q = new String[]{
  21. Manifest.permission.READ_EXTERNAL_STORAGE,
  22. Manifest.permission.WRITE_EXTERNAL_STORAGE
  23. };
  24. private static final int REQUEST_CODE_EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q = 11223;
  25. private static final int REQUEST_CODE_SAF_PERMISSIONS = 11224;
  26. private static final String documentsuiPkg = "com.google.android.documentsui";
  27. public static boolean hasAndroidDataPermission(Context context) {
  28. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
  29. for (String permission : EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q) {
  30. if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
  31. return false;
  32. }
  33. }
  34. return true;
  35. }
  36. PackageManager packageManager = context.getPackageManager();
  37. try {
  38. ApplicationInfo applicationInfo = packageManager.getApplicationInfo(documentsuiPkg, PackageManager.MATCH_UNINSTALLED_PACKAGES);
  39. if (applicationInfo.targetSdkVersion >= 34) {
  40. return false;
  41. }
  42. } catch (PackageManager.NameNotFoundException ignore) {
  43. }
  44. List<StorageVolume> storageVolumes = XStorageManager.getReadableStorageVolumes(context);
  45. for (StorageVolume storageVolume : storageVolumes) {
  46. Uri treeUri = StorageVolumeUtil.getTreeUri(storageVolume);
  47. XSAFFile xFile = new XSAFFile(context, treeUri, Arrays.asList("Android", "data"));
  48. if (!hasPermission(context, xFile)) {
  49. return false;
  50. }
  51. }
  52. return true;
  53. }
  54. private static boolean hasPermission(Context context, XSAFFile xFile) {
  55. ContentResolver contentResolver = context.getContentResolver();
  56. List<UriPermission> persistedUriPermissions = contentResolver.getPersistedUriPermissions();
  57. for (UriPermission persistedUriPermission : persistedUriPermissions) {
  58. if (!persistedUriPermission.isReadPermission() || !persistedUriPermission.isWritePermission()) {
  59. continue;
  60. }
  61. Uri uri = persistedUriPermission.getUri();
  62. if (uri == null) {
  63. continue;
  64. }
  65. Uri pathUri = xFile.getPathUri();
  66. if (uri.toString().contains(pathUri.toString())) {
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. public static void requestAndroidDataPermission(Activity activity) {
  73. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
  74. activity.requestPermissions(EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q, REQUEST_CODE_EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q);
  75. } else {
  76. Intent grantIntentSDMOg = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
  77. grantIntentSDMOg.putExtra("android.content.extra.SHOW_ADVANCED", true);
  78. List<StorageVolume> storageVolumes = XStorageManager.getReadableStorageVolumes(activity);
  79. for (StorageVolume storageVolume : storageVolumes) {
  80. Uri treeUri = StorageVolumeUtil.getTreeUri(storageVolume);
  81. XSAFFile xFile = new XSAFFile(activity, treeUri, Arrays.asList("Android", "data"));
  82. if (!hasPermission(activity, xFile)) {
  83. grantIntentSDMOg.putExtra(DocumentsContract.EXTRA_INITIAL_URI, xFile.getDocumentUri());
  84. activity.startActivityForResult(grantIntentSDMOg, REQUEST_CODE_SAF_PERMISSIONS);
  85. }
  86. }
  87. }
  88. }
  89. public static boolean onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
  90. if (requestCode == REQUEST_CODE_SAF_PERMISSIONS) {
  91. if (resultCode == Activity.RESULT_OK) {
  92. Uri treeUri = data.getData();
  93. if (treeUri == null) {
  94. return false;
  95. }
  96. activity.getContentResolver().takePersistableUriPermission(treeUri,
  97. Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  98. return true;
  99. }
  100. return false;
  101. }
  102. return false;
  103. }
  104. public static boolean onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions, int[] grantResults) {
  105. if (requestCode == REQUEST_CODE_EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q) {
  106. for (int grantResult : grantResults) {
  107. if (grantResult != PackageManager.PERMISSION_GRANTED) {
  108. return false;
  109. }
  110. }
  111. return true;
  112. }
  113. return false;
  114. }
  115. }