#android #rename #mediastore #android-mediascanner
#Android #переименовать #mediastore #android-mediascanner
Вопрос:
После переименования изображений с помощью file.renameTo(file)
они становятся серыми в галерее и становятся недоступными. Я перепробовал все способы повторного сканирования изображений, в конце концов, без надежды, некоторые работают в старых версиях, некоторые вообще не работают, поэтому я пытаюсь обновить 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);
этот метод выдает это исключение none fatal в logcat
07-04 02:37:18.448: Без MediaProvider(2947): java.lang.NumberFormatException: Недопустимый long: «media» 07-04 02:37:18.448: Без MediaProvider(2947): в java.lang.Long.invalidLong(Long.java:124) 07-04 02:37:18.448: С MediaProvider(2947): в java.lang.Long.parse(Длинный.java:361) 07-04 02:37:18.448: С MediaProvider(2947): на java.lang.Long.parseLong(Длинный.java:352) 07-04 02:37:18.448: С MediaProvider(2947): на java.lang.Long.parseLong(Длинный.java:318) 07-04 02:37:18.448: С MediaProvider(2947): в android.content.ContentUris.parseId(ContentUris.java:86) 07-04 02:37:18.448: С MediaProvider(2947): на com.android.providers.media.MediaThumbRequest.(MediaThumbRequest.java:93) 07-04 02:37:18.448: С MediaProvider(2947): на com.android.providers.media.MediaProvider.requestMediaThumbnail(MediaProvider.java:3742) 07-04 02:37:18.448: С MediaProvider(2947): на com.android.providers.media.MediaProvider.update(MediaProvider.java:4353) 07-04 02:37:18.448: С MediaProvider(2947): в android.content.ContentProvider$Transport.update(ContentProvider.java:287) 07-04 02:37:18.448: С MediaProvider(2947): на Android.Содержание.ContentProviderNative.onTransact(ContentProviderNative.java:215) 07-04 02:37:18.448: С MediaProvider(2947): в android.os.Binder.execTransact(Binder.java:404)
РЕДАКТИРОВАТЬ: Я уверен, что это можно сделать. Поскольку, когда я переименовываю или добавляю какой-либо медиафайл, затем, используя ES File Explorer и изменяя путь к папке, содержащей этот носитель, они отображаются в галерее и добавляются в media Store, требуется некоторое время, чтобы восстановить миниатюру, если в этой папке слишком много носителей. кстати, я смотрю logcat, когда переименовываю файл изображения: Media Provider object removed
затем какой-то logcat с тегом art
о создании растрового изображения, я уверен, что единственный способ сделать это — обновить MediaStore новыми данными и растровым изображением. Теперь, как найти и удалить предыдущие данные из MediaStore
и добавить новые? Если я удалю его из MediaStore, приведет ли это к удалению этого файла с диска?
Заранее спасибо
Ответ №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() });
}
Вместо того, чтобы пытаться напрямую обновить файл изображения в mediastore, как вы пытаетесь сделать в своей последней попытке, вам следует попытаться сначала удалить старую строку, а затем добавить новую строку.
Скажите мне, решило ли это вашу проблему.
Комментарии:
1. немного поздно, но спасибо. У меня была небольшая проблема с удалением носителя из
MediaStore
, потому что это фактически удаляет файл изображения из дискового хранилища.2. да, немного поздно, возможно, этот пост поможет другим людям решить ту же проблему. Кстати, не имеет значения, удален ли файл изображения, потому что мы уже знаем, что операция переименования файла прошла успешно, проверив ее 😉
3. У меня похожая проблема, и я очень смущен, спасибо за ответ, я попробую! Спасибо
4. @syl80, ваше решение работает хорошо. Тогда как вы относитесь к переименованию папки?