6

再起動せずにMediaStoreに最新の情報があることを確認したいので、SOで見つけた一般的な方法を使用してMediaScannerをトリガーしたいと思います。

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

これは、Samsung S2 w / ICSでは正常に機能しますが、Nexus 7 w/JellyBeanでは機能しません。Logcatは私のNexus7でこれを示しています:

WARN/ActivityManager(480): Permission denied: checkComponentPermission() owningUid=10014
WARN/BroadcastQueue(480): Permission Denial: broadcasting Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/emulated/0 flg=0x10 } from com.example.foo.bar (pid=17488, uid=10046) is not exported from uid 10014 due to receiver com.android.providers.downloads/.DownloadReceiver
INFO/ActivityManager(480): Start proc com.google.android.music:main for broadcast com.google.android.music/.store.MediaStoreImportService$Receiver: pid=17858 uid=10038 gids={50038, 3003, 1015, 1028}
INFO/MusicStore(17858): Database version: 50
INFO/MediaStoreImporter(17858): Update: incremental Added music: 0 Updated music: 0 Deleted music: 0 Created playlists: 0 Updated playlists: 0 Deleted playlists: 0 Inserted playlist items: 0 Deleted playlist items: 0 Removed orphaned playlist items: 0

最後の行は理論的には有望に聞こえますが、新しいファイルがSDカードにプッシュされた後でも(adb pushを介して)値は常に0です。私の古いデバイス(S2)では、SDカードを再マウントします。

AndroidManifest.xmlに次のアクセス許可を追加しましたが、これらのアクセス許可がない場合と同じように動作します。

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

アイデア/代替案はありますか?


編集1:

新規または変更または削除されたファイルのファイルパスがわからないことに注意してください。MediaStoreが最新であることを確認したいだけです。

4

3 に答える 3

12

CommonsWareの回答に基づくサンプルコードは次のとおりです。

MediaScannerConnection.scanFile(activity, new String[]{path}, null,
                                new MediaScannerConnection.OnScanCompletedListener() {
    @Override
    public void onScanCompleted(final String path, final Uri uri) {
        Log.i(TAG, String.format("Scanned path %s -> URI = %s", path, uri.toString()));
    }
});

ほとんどの場合、追加/更新などのファイルがわかっている場合でも。MediaStoreに、CommonsWareの回答に従う必要があります。ファイルパスがわからないため、大まかな方法​​で解決する必要がある場所にソリューションを投稿したいと思いました。私はこれを主にテスト/デモに使用します:

Uri uri = Uri.fromFile(Environment.getExternalStorageDirectory());
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, uri));

ところで、どちらのソリューションにも権限は必要ありません。

于 2013-03-05T22:50:10.580 に答える
8

SOで見つけた人気のある方法を使用して

ACTION_MEDIA_MOUNTEDの放送は私見の適切な解決策ではありませんでした。

アイデア/代替案はありますか?

MediaScannerConnection静的メソッドなどを使用scanFile()ます。

于 2013-03-01T02:41:53.873 に答える
7

私の答えは少し遅れていますが、新しいファイルを保存し、Androidキットカットでそのファイルだけでメディアストアを拡張したい人には役立つかもしれません:Androidキットカットでは、インテントACTION_MEDIA_MOUNTEDは非システムアプリに対してブロックされています(Iファイルシステム全体をスキャンするのはかなり費用がかかるためだと思います)。ただし、インテントACTION_MEDIA_SCANNER_SCAN_FILEを使用して、メディアストアにファイルを追加することは可能です。

File f = new File(path to the file you would like to add to the media store ...);
try {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    Uri uri = Uri.fromFile(f);
    mediaScanIntent.setData(uri);
    sendBroadcast(mediaScanIntent);
} catch(Exception e) {
    ... 
}
于 2014-08-02T20:25:53.613 に答える