因为我想确保 MediaStore 拥有最新信息而无需重新启动我想使用我在 SO 上找到的流行方式触发 MediaScanner
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
这在我的三星 S2 w/ICS 上运行良好,但在我的 Nexus 7 w/JellyBean 上运行良好。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
最后一行在理论上听起来令人鼓舞,但即使在新文件被推送到 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 是最新的。