Переименовать изображение с помощью MediaStore android

После переименования изображений с помощью 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): в 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 File Explorer и изменения пути к этой папке, содержащей медиафайлы, они появляются в галерее и добавляются в хранилище медиафайлов. Восстановление эскиза занимает некоторое время, если у вас много медиафайлов. в этой папке. Кстати, я наблюдаю за логарифмом, когда переименовываю файл изображения: Media Provider object removed затем какой-то логарифм с тегом art о создании растрового изображения, я уверен, что единственный способ сделать это - обновить MediaStore новыми данными и растровым изображением. Теперь, как найти и удалить предыдущие данные из MediaStore и добавить новые? Если я удалю его из MediaStore, это приведет к удалению этого файла с диска?

заранее спасибо


person M. Reza Nasirloo    schedule 03.07.2014    source источник


Ответы (1)


Этот метод работает для меня на 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() });
}

Вместо того, чтобы пытаться напрямую обновить файл изображения в хранилище мультимедиа, как вы пытаетесь сделать в своей последней попытке, вы должны попытаться сначала удалить старую строку, а затем добавить новую строку.

Скажите, решило ли это вашу проблему.

person syl8o    schedule 02.01.2015
comment
немного поздно, но спасибо. У меня было небольшое беспокойство по поводу удаления носителя из MediaStore, потому что он фактически удаляет файл изображения из дискового хранилища. - person M. Reza Nasirloo; 02.01.2015
comment
да, немного поздно, может быть, этот пост поможет другим людям в той же проблеме. Кстати, не имеет значения, удален ли файл изображения, потому что мы уже знаем, что операция переименования файла прошла успешно, проверив его;) - person syl8o; 02.01.2015
comment
У меня похожая проблема, и я очень запутался, спасибо за ответ, я попробую! Благодарность - person Mr. Lemon; 22.04.2020
comment
@ syl80, ваше решение работает хорошо. Тогда как вы думаете о переименовании папки? - person Gary Chen; 24.12.2020