android - 使用 MediaStore android 重命名图像

标签 android rename mediastore android-mediascanner

使用 file.renameTo(file) 重命名图像后,它们在图库中变灰并且不可用。我尝试了各种 Intent 来重新扫描图像,最后没有希望,有些在旧版本上工作有些根本不起作用,所以我正在尝试更新 MediaStore,但不确定如何正确地做到这一点。

这是我的一些代码

这是我早期的方法之一

MediaScannerConnection.scanFile(mContext,
                    filesPath , null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });

另一个

private void scanMedia(File file) {

    Uri uri = Uri.fromFile(file);
    Intent scanFileIntent = new Intent(
            Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
    mContext.sendBroadcast(scanFileIntent);
}

这适用于 pre 19 但不适用于 kitkat

mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
            Uri.parse("file://" + Environment.getExternalStorageDirectory())));

这是 MediaStore 的

int row = mContext.getContentResolver()
                        .update(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        valuesNewFilePath,
                        MediaStore.MediaColumns.DATA + "='" + oldFilePath + "'",
                        null);

此方法在 logcat 中抛出此非致命异常


07-04 02:37:18.448: W/MediaProvider(2947): java.lang.NumberFormatException: Invalid long: "media"07-04 02:37:18.448: W/MediaProvider(2947): at java. lang.Long.invalidLong(Long.java:124) 07-04 02:37:18.448: W/MediaProvider(2947): 在 java.lang.Long.parse(Long.java:361) 07-04 02:37: 18.448:W/MediaProvider(2947):在 java.lang.Long.parseLong(Long.java:352)07-04 02:37:18.448:W/MediaProvider(2947):在 java.lang.Long.parseLong(Long .java:318) 07-04 02:37:18.448: W/MediaProvider(2947): 在 android.content.ContentUris.parseId(ContentUris.java:86) 07-04 02:37:18.448: W/MediaProvider(2947) ):在 com.android.providers.media.MediaThumbRequest。(MediaThumbRequest.java:93)07-04 02:37:18.448:W/MediaProvider(2947):在 com.android.providers.media.MediaProvider.requestMediaThumbnail(MediaProvider .java:3742) 07-04 02:37:18.448: W/MediaProvider(2947): 在 com.android.providers.media.MediaProvider.update(MediaProvider.java:4353) 07-04 02:37:18.448: W/MediaProvider(2947): 在 android.content.ContentProvider$Transport.update(ContentProvider.java:287) 07-04 02:37:18.448: W/MediaProvider(2947): 在 android.content.ContentProviderNative.onTransact(ContentProviderNative. java:215) 07-04 02:37:18.448: W/MediaProvider(2947): 在 android.os.Binder.execTransact(Binder.java:404)

编辑:我相信这是可以做到的。因为当我重命名或添加一些媒体文件,然后使用 ES 文件资源管理器并更改该媒体包含文件夹的路径时,它们会出现在图库中并添加到媒体存储中,如果您有很多媒体,则需要一些时间来重新生成缩略图在那个文件夹上。顺便说一下,当我重命名图像文件时我会看 logcat:Media Provider object removed 然后是一些带有标签 art 关于装箱位图的 logcat,我确定唯一的方法这样做是用新数据和位图更新 MediaStore。现在如何从 MediaStore 中查找和删除以前的数据并添加新数据?如果我从 MediaStore 中删除它是否会导致从磁盘中删除该文件?

提前致谢

最佳答案

这个方法在 android-21 上对我有用:

public static boolean renameImageFile(Context c, File from, File to) {
    to = getFileWithUnicName(to);
    if (from.renameTo(to)) {
        removeMedia(c, from);
        addMedia(c, to);
        return true;
    } else {
        return false;
    }
}

public static void addMedia(Context c, File f) {
    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    intent.setData(Uri.fromFile(f));
    c.sendBroadcast(intent);
}

private static void removeMedia(Context c, File f) {
    ContentResolver resolver = c.getContentResolver();
    resolver.delete(Images.Media.EXTERNAL_CONTENT_URI, Images.Media.DATA + "=?", new String[] { f.getAbsolutePath() });
}

与其像上次尝试那样尝试直接更新媒体存储中的图像文件,不如尝试先删除旧行,然后添加新行。

告诉我它是否解决了您的问题。

关于android - 使用 MediaStore android 重命名图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564336/

相关文章:

android - 我们还应该使用 MediaStore.Images.Media.insertImage() 方法吗?

java - Android: main.xml 错误

android - 去电安卓

android - 如何使用水平 ScrollView 组件?

rename - 重命名 gtsummary、tbl_regression/tbl_stack 中的行

java - Android 图库在 ACTION_IMAGE_CAPTURE 后未更新

java - Android 应用程序无法更改 JAVA 中 HTTP 连接的响应代码

android - 如何在仅知道其媒体内容 Uri 的 Android 中重命名文件

ftp - 使用 ftp 重命名多个文件

Android MediaStore sqlite 数据库位置