|
|
@@ -10,11 +10,23 @@ import android.content.pm.ApplicationInfo;
|
|
|
import android.content.pm.PackageManager;
|
|
|
import android.net.Uri;
|
|
|
import android.os.Build;
|
|
|
+import android.os.Environment;
|
|
|
import android.os.storage.StorageVolume;
|
|
|
import android.provider.DocumentsContract;
|
|
|
|
|
|
+import androidx.activity.ComponentActivity;
|
|
|
+import androidx.activity.result.ActivityResult;
|
|
|
+import androidx.activity.result.contract.ActivityResultContracts;
|
|
|
+import androidx.core.app.ActivityCompat;
|
|
|
+import androidx.core.content.ContextCompat;
|
|
|
+
|
|
|
+import com.datarecovery.master.utils.ActivityForResultUtil;
|
|
|
+import com.datarecovery.master.utils.BoxingUtil;
|
|
|
+import com.datarecovery.master.utils.PermissionUtil;
|
|
|
+
|
|
|
import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* 这个权限申请写的不好,看怎么根据业务需求优化
|
|
|
@@ -32,7 +44,7 @@ public class XFilePermission {
|
|
|
public static boolean hasAndroidDataPermission(Context context) {
|
|
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
|
|
for (String permission : EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q) {
|
|
|
- if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
|
|
|
+ if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -76,9 +88,26 @@ public class XFilePermission {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- public static void requestAndroidDataPermission(Activity activity) {
|
|
|
+ public static void requestAndroidDataPermission(ComponentActivity activity, PermissionCallback callback) {
|
|
|
+ if (activity == null) {
|
|
|
+ throw new RuntimeException("activity is null");
|
|
|
+ }
|
|
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
|
|
- activity.requestPermissions(EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q, REQUEST_CODE_EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q);
|
|
|
+ new ActivityForResultUtil<String[], Map<String, Boolean>>().startActivityForResult(activity, new ActivityResultContracts.RequestMultiplePermissions(), EXTERNAL_STORAGE_PERMISSIONS_BELOW_Q, result -> {
|
|
|
+ boolean permission = false;
|
|
|
+ for (Map.Entry<String, Boolean> entry : result.entrySet()) {
|
|
|
+ Boolean value = entry.getValue();
|
|
|
+ if (BoxingUtil.boxing(value)) {
|
|
|
+ permission = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (permission) {
|
|
|
+ if (callback != null) callback.onPermissionGranted();
|
|
|
+ } else {
|
|
|
+ if (callback != null) callback.onPermissionDenied();
|
|
|
+ }
|
|
|
+ });
|
|
|
} else {
|
|
|
Intent grantIntentSDMOg = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
|
|
|
grantIntentSDMOg.putExtra("android.content.extra.SHOW_ADVANCED", true);
|
|
|
@@ -88,7 +117,17 @@ public class XFilePermission {
|
|
|
XSAFFile xFile = new XSAFFile(activity, treeUri, Arrays.asList("Android", "data"));
|
|
|
if (!hasPermission(activity, xFile)) {
|
|
|
grantIntentSDMOg.putExtra(DocumentsContract.EXTRA_INITIAL_URI, xFile.getDocumentUri());
|
|
|
- activity.startActivityForResult(grantIntentSDMOg, REQUEST_CODE_SAF_PERMISSIONS);
|
|
|
+ new ActivityForResultUtil<Intent, ActivityResult>().startActivityForResult(activity, new ActivityResultContracts.StartActivityForResult(), grantIntentSDMOg, result -> {
|
|
|
+ Intent data = result.getData();
|
|
|
+ Uri uri = null;
|
|
|
+ if (result.getResultCode() == Activity.RESULT_OK && data != null && (uri = data.getData()) != null) {
|
|
|
+ activity.getContentResolver().takePersistableUriPermission(uri,
|
|
|
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
|
+ if (callback != null) callback.onPermissionGranted();
|
|
|
+ } else {
|
|
|
+ if (callback != null) callback.onPermissionDenied();
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -121,4 +160,11 @@ public class XFilePermission {
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ public interface PermissionCallback {
|
|
|
+ void onPermissionGranted();
|
|
|
+
|
|
|
+ void onPermissionDenied();
|
|
|
+ }
|
|
|
}
|