如何触发MediaScan在Nexus 7上?(How to trigger MediaScan o

2019-07-20 18:42发布

因为我想确保MediaStore有最新的信息,而不必重新启动我想用流行的方式,我发现SO触发MediaScanner

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

这工作正常,在我的三星S2 W / ICS却没有关于我的Nexus 7 W /豆形软糖。 logcat中显示了这个在我的Nexus 7:

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

最后一行在理论上听起来鼓舞人心的,但值始终为0,即使之后的新文件已经被推到SD卡(通过ADB推)。 在我的旧的设备(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是最新的更新。

Answer 1:

采用了流行的方式,我发现SO

伪造ACTION_MEDIA_MOUNTED广播从来就不是一个合适的解决方案恕我直言。

任何想法/替代品?

使用MediaScannerConnection ,诸如经由其scanFile()静态方法 。



Answer 2:

下面是基于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的答案,我想张贴我的解决方案,我需要做的是粗糙的方式,因为我不知道该文件的路径。 我用这个主要是用于测试/ demoing:

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

顺便说一句,没有任何权限所必需的任何解决方案。



Answer 3:

我的答案是晚了一点,但它可能会帮助那些谁保存新文件,并想通过只在Android奇巧文件来扩展媒体商店:我在Android奇巧的意图ACTION_MEDIA_MOUNTED被封闭非系统应用(认为,由于扫描整个文件系统是相当昂贵)。 但是,仍然有可能使用的意图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) {
    ... 
}


文章来源: How to trigger MediaScan on Nexus 7?