1

で画像の名前を変更するとfile.renameTo(file)、ギャラリーで灰色になり、使用できなくなります。画像を再スキャンするためにあらゆる種類のインテントを試してみましたが、最終的には希望がありませんでした。古いバージョンで動作するものもあれば、まったく機能しないものもあるため、 を更新しようとしてMediaStoreいますが、その方法がわかりません。

これが私のコードの一部です

これは私の初期のアプローチの1つでした

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);
}

これは19より前では機能しますが、キットカットでは機能しません

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: 無効な長さ:「メディア」 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) でContentProviderNative.onTransact (ContentProviderNative.java:215) 07-04 02:37:18.448: W/MediaProvider (2947): android.os.Binder.execTransact (Binder.java:404) で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 から削除すると、そのファイルがディスクから削除されますか?

前もって感謝します

4

1 に答える 1

7

この方法は 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() });
}

前回の試みのように、メディアストア内のイメージ ファイルを直接更新しようとする代わりに、まず古い行を削除してから新しい行を追加するようにしてください。

問題が解決したかどうか教えてください。

于 2015-01-02T14:16:16.540 に答える