重命名由android 10中的应用程序创建的Mediastore的文件。正在使用Android API 30,但在API 29中显示错误

【字号: 日期:2024-02-20浏览:51作者:雯心
如何解决重命名由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 collectionsswitch (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;}

相关文章: