下面列出了android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
if (requestCode == 233 && resultCode == Activity.RESULT_OK) {
Uri uriTree = resultData.getData();
if (uriTree != null) {
final int takeFlags = getIntent().getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uriTree, takeFlags);
editor.putString("pic_uri_tree", uriTree.toString());
editor.apply();
// 创建所选目录的DocumentFile,可以使用它进行文件操作
DocumentFile root = DocumentFile.fromTreeUri(this, uriTree);
// 比如使用它创建文件夹
//DocumentFile[] rootList = root.listFiles();
shotOneTextViaSAF(root);
}
}
}
@Override
public int checkUriPermission(Uri uri, String readPermission,
String writePermission, int pid, int uid, int modeFlags) {
if (DEBUG) {
Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
+ readPermission + " writePermission=" + writePermission
+ " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
}
if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
if (readPermission == null
|| checkPermission(readPermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
if (writePermission == null
|| checkPermission(writePermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
: PackageManager.PERMISSION_DENIED;
}
private String uriModeFlagToString(int uriModeFlags) {
StringBuilder builder = new StringBuilder();
if ((uriModeFlags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
builder.append("read and ");
}
if ((uriModeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
builder.append("write and ");
}
if ((uriModeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0) {
builder.append("persistable and ");
}
if ((uriModeFlags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0) {
builder.append("prefix and ");
}
if (builder.length() > 5) {
builder.setLength(builder.length() - 5);
return builder.toString();
} else {
throw new IllegalArgumentException("Unknown permission mode flags: " + uriModeFlags);
}
}
@Override
public int checkUriPermission(Uri uri, String readPermission,
String writePermission, int pid, int uid, int modeFlags) {
if (DEBUG) {
Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
+ readPermission + " writePermission=" + writePermission
+ " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
}
if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
if (readPermission == null
|| checkPermission(readPermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
if (writePermission == null
|| checkPermission(writePermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
: PackageManager.PERMISSION_DENIED;
}
/**
* Request edit of image (by image editor/viewer - for example to crop image)
*
* @param file File that should be edited
*/
public void requestPictureEdit(final File file) {
Uri uri = getUriByFileProviderAuthority(file);
int flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION;
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setDataAndType(uri, "image/*");
intent.addFlags(flags);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra(EXTRA_FILEPATH, file.getAbsolutePath());
for (ResolveInfo resolveInfo : _context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)) {
String packageName = resolveInfo.activityInfo.packageName;
_context.grantUriPermission(packageName, uri, flags);
}
_context.startActivity(Intent.createChooser(intent, null));
}
@Override
public int checkUriPermission(Uri uri, String readPermission,
String writePermission, int pid, int uid, int modeFlags) {
if (DEBUG) {
Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
+ readPermission + " writePermission=" + writePermission
+ " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
}
if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
if (readPermission == null
|| checkPermission(readPermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
if (writePermission == null
|| checkPermission(writePermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
: PackageManager.PERMISSION_DENIED;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Logger.debug("requestCode = %d, resultCode = %d, data = %s",
requestCode,
resultCode,
data);
if (requestCode == REQUEST_PICK_IMAGE
&& resultCode == RESULT_OK) {
Uri pickedImageUri = data.getData();
Logger.debug("picked: %s", pickedImageUri);
if (pickedImageUri != null) {
if(Build.VERSION.SDK_INT >= 19){
final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
getContentResolver()
.takePersistableUriPermission(pickedImageUri, takeFlags);
}
analyzeImage(pickedImageUri);
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public int checkUriPermission(Uri uri, String readPermission,
String writePermission, int pid, int uid, int modeFlags) {
if (DEBUG) {
Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
+ readPermission + " writePermission=" + writePermission
+ " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
}
if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
if (readPermission == null
|| checkPermission(readPermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
if (writePermission == null
|| checkPermission(writePermission, pid, uid)
== PackageManager.PERMISSION_GRANTED) {
return PackageManager.PERMISSION_GRANTED;
}
}
return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
: PackageManager.PERMISSION_DENIED;
}
boolean releasePersistableModes(int modeFlags) {
modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
final int before = persistedModeFlags;
persistableModeFlags &= ~modeFlags;
persistedModeFlags &= ~modeFlags;
if (persistedModeFlags == 0) {
persistedCreateTime = INVALID_TIME;
}
updateModeFlags();
return persistedModeFlags != before;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == CODE_CHOOSE_FILE) {
Uri uri = intent.getData();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final int takeFlags = intent.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
cordova.getActivity().getContentResolver().takePersistableUriPermission(uri, takeFlags);
}
callbackContext.success(asFile(uri));
callbackContext = null;
}
super.onActivityResult(requestCode, resultCode, intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SELECT_PIC4MAIN:
if (data == null) return;
// 用户从图库选择图片后会返回所选图片的Uri
Uri uri1 = data.getData();
this.headerImg.setImageURI(uri1);
saveImageUri(SELECT_PIC4MAIN, uri1);
// 获取永久访问图片URI的权限
int takeFlags = data.getFlags();
takeFlags &=(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uri1, takeFlags);
break;
case SELECT_PIC4DRAWER:
if (data == null) return;
// 用户从图库选择图片后会返回所选图片的Uri
Uri uri2 = data.getData();
this.drawerBanner.setImageURI(uri2);
saveImageUri(SELECT_PIC4DRAWER, uri2);
// 获取永久访问图片URI的权限
int takeFlags2 = data.getFlags();
takeFlags2 &=(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uri2, takeFlags2);
break;
}
}
private String uriModeFlagToString(int uriModeFlags) {
switch (uriModeFlags) {
case Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
return "read and write";
case Intent.FLAG_GRANT_READ_URI_PERMISSION:
return "read";
case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
return "write";
}
throw new IllegalArgumentException(
"Unknown permission mode flags: " + uriModeFlags);
}
private void addReadOwner(UriPermissionOwner owner) {
if (mReadOwners == null) {
mReadOwners = Sets.newArraySet();
ownedModeFlags |= Intent.FLAG_GRANT_READ_URI_PERMISSION;
updateModeFlags();
}
if (mReadOwners.add(owner)) {
owner.addReadPermission(this);
}
}
private void onSelectBackupsLocationResult(int resultCode, Intent data) {
Uri uri = data.getData();
if (resultCode != Activity.RESULT_OK || uri == null) {
return;
}
int flags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContext().getContentResolver().takePersistableUriPermission(data.getData(), flags);
_prefs.setBackupsLocation(uri);
_prefs.setIsBackupsEnabled(true);
_prefs.setBackupsError(null);
_backupsLocationPreference.setSummary(String.format("%s: %s", getString(R.string.pref_backups_location_summary), Uri.decode(uri.toString())));
updateBackupPreference();
}
private String uriModeFlagToString(int uriModeFlags) {
switch (uriModeFlags) {
case Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
return "read and write";
case Intent.FLAG_GRANT_READ_URI_PERMISSION:
return "read";
case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
return "write";
}
throw new IllegalArgumentException(
"Unknown permission mode flags: " + uriModeFlags);
}
public static void grantPermissions(Context context, Intent intent, Uri uri, boolean writeAble) {
int flag = Intent.FLAG_GRANT_READ_URI_PERMISSION;
if (writeAble) {
flag |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
}
intent.addFlags(flag);
List<ResolveInfo> resInfoList = context.getPackageManager()
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, uri, flag);
}
}
@SuppressWarnings("ResourceType")
@TargetApi(Build.VERSION_CODES.KITKAT)
public static Uri ensureUriPermission(Context context, Intent intent) {
Uri uri = intent.getData();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final int takeFlags = intent.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
context.getContentResolver().takePersistableUriPermission(uri, takeFlags);
}
return uri;
}
public static int getIntentFlags() {
return C.API_NOUGAT ? Intent.FLAG_GRANT_READ_URI_PERMISSION : 0;
}
/**
* Internal helper method to create an {@link MediaIntent} for opening
* an installed camera app.
*
* @param context A valid application {@link Context}
* @return An {@link MediaIntent} or null if this action isn't supported by
* the system.
*/
private Pair<MediaIntent, MediaResult> pickImageFromCameraInternal(Context context, int requestCode){
final File imagePath = storage.getFileForCamera(context);
if (imagePath == null){
L.w(Belvedere.LOG_TAG, "Camera Intent: Image path is null. There's something wrong with the storage.");
return null;
}
final Uri uriForFile = storage.getFileProviderUri(context, imagePath);
if (uriForFile == null) {
L.w(Belvedere.LOG_TAG, "Camera Intent: Uri to file is null. There's something wrong with the storage or FileProvider configuration.");
return null;
}
L.d(Belvedere.LOG_TAG, String.format(Locale.US, "Camera Intent: Request Id: %s - File: %s - Uri: %s", requestCode, imagePath, uriForFile));
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uriForFile);
int permission = Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION;
storage.grantPermissionsForUri(context, intent, uriForFile, permission);
/*
https://code.google.com/p/android/issues/detail?id=188073&q=label%3APriority-Medium&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&start=100
*/
final boolean cameraPermissionInManifestButNoGranted =
PermissionUtil.hasPermissionInManifest(context, Manifest.permission.CAMERA) &&
!PermissionUtil.isPermissionGranted(context, Manifest.permission.CAMERA);
final MediaResult r = Storage.getMediaResultForUri(context, uriForFile);
final MediaResult belvedereResult = new MediaResult(imagePath, uriForFile, uriForFile, imagePath.getName(), r.getMimeType(), r.getSize(), r.getWidth(), r.getHeight());
final MediaIntent mediaIntent = new MediaIntent(
requestCode,
intent,
cameraPermissionInManifestButNoGranted ? Manifest.permission.CAMERA : null,
true,
MediaIntent.TARGET_CAMERA
);
return new Pair<>(mediaIntent, belvedereResult);
}
/**
* Revoke {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION} that were
* previously granted by {@link #grantPermissionsForUri(Intent, Uri)}.
*
* @param uri An {@link Uri}
*/
public void revokePermissionsForUri(@NonNull Uri uri) {
L.d(LOG_TAG, String.format(Locale.US, "Revoke Permission - Uri: %s", uri));
int permissions = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
storage.revokePermissionsFromUri(context, uri, permissions);
}