如何解决重命名由android 10中的应用程序创建的Mediastore的文件正在使用Android API 30,但在API 29中显示错误
java.lang.IllegalArgumentException:不允许移动内容:// media / external / file / 116,这不是定义明确的集合的一部分
因此,如果您使用集合,则不适用于Android Q;
Uri extUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
但允许“定义明确的集合”,例如:
Uri extUri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
// Use "Pictures/MyFolder" for RELATIVE_PATH
我留给您查找其他定义明确的集合。
为什么这仅适用于Android Q我不知道。
您可以在以下Java文件中看到该消息:https ://android.googlesource.com/platform/packages/providers/MediaProvider/+/refs/heads/master/src/com/android/providers/media/MediaProvider.java
引用:
// We only support movement under well-defined collections
switch (match) {
case AUDIO_MEDIA_ID:
case VIDEO_MEDIA_ID:
case IMAGES_MEDIA_ID:
case DOWNLOADS_ID:
break;
default:
throw new IllegalArgumentException("Movement of " + uri
+ " which isn't part of well-defined collection not allowed");
}
如果重命名失败,请使用SAF(如前所述)。如何在仅知道媒体内容Uri的Android中重命名文件
解决方法
在这里,此renameFile(..)函数在Android API 30中正常工作。但是,在Android API 29中却无效,并显示如下错误:
java.lang.IllegalArgumentException:不允许移动内容:// media / external / file /116,这不是定义明确的集合的一部分
更新说明:
-开始-
为了使用sdk-29,我们必须使用Uri作为extUri =MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL),例如:
private static Uri extUri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL);
代替下面的代码。并将 MediaStore.Files.FileColumns 更新为 MediaStore.Downloads
-结束-
Uri extUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
String relativeLocation = Environment.DIRECTORY_DOWNLOADS + File.separator + "AppFolder";
函数renameFile(…)
boolean renameFile(Context context,String newName,String displayName) {
try {
Long id = getIdFromDisplayName(displayName);
ContentResolver contentResolver = context.getContentResolver();
Uri mUri = ContentUris.withAppendedId(extUri,id);
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Files.FileColumns.IS_PENDING,1);
contentResolver.update(mUri,contentValues,null,null);
contentValues.clear();
contentValues.put(MediaStore.Files.FileColumns.DISPLAY_NAME,newName);
// contentValues.put(MediaStore.Files.FileColumns.MIME_TYPE,"files/pdf");
// contentValues.put(MediaStore.Files.FileColumns.RELATIVE_PATH,relativeLocation);
// contentValues.put(MediaStore.Files.FileColumns.TITLE,"SomeName");
// contentValues.put(MediaStore.Files.FileColumns.DATE_ADDED,System.currentTimeMillis() / 1000);
// contentValues.put(MediaStore.Files.FileColumns.DATE_TAKEN,System.currentTimeMillis());
contentValues.put(MediaStore.Files.FileColumns.IS_PENDING,0);
contentResolver.update(mUri,null);
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
函数getIdFromDisplayName(…)
@RequiresApi(api = Build.VERSION_CODES.Q)
Long getIdFromDisplayName(String displayName) {
String[] projection;
projection = new String[]{MediaStore.Files.FileColumns._ID};
// TODO This will break if we have no matching item in the MediaStore.
Cursor cursor = getContentResolver().query(extUri,projection,MediaStore.Files.FileColumns.DISPLAY_NAME + " LIKE ?",new String[]{displayName},null);
assert cursor != null;
cursor.moveToFirst();
if (cursor.getCount() > 0) {
int columnIndex = cursor.getColumnIndex(projection[0]);
long fileId = cursor.getLong(columnIndex);
cursor.close();
return fileId;
}
return null;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。