【发布时间】:2011-03-09 18:36:43
【问题描述】:
我的应用程序显示 sdcard 中的歌曲列表,并且有一个从 SD 卡中删除歌曲的选项。
即使歌曲被删除,歌曲仍然出现在我的应用程序列表中。
如何更新 android 媒体数据库并显示更新后的数据库?
【问题讨论】:
我的应用程序显示 sdcard 中的歌曲列表,并且有一个从 SD 卡中删除歌曲的选项。
即使歌曲被删除,歌曲仍然出现在我的应用程序列表中。
如何更新 android 媒体数据库并显示更新后的数据库?
【问题讨论】:
Android 有一个用于跟踪媒体文件的缓存。
试试这个:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
它会使 MediaScanner 服务再次运行,这应该会从设备的缓存中删除已删除的歌曲。
您还需要将此权限添加到您的 AndroidManifest.xml:
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
【讨论】:
对于 ICS 之前的 Android,发送ACTION_MEDIA_MOUNTED 广播:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
对于 ICS 和 Jelly Bean,您可以使用MediaScannerConnection API 来扫描媒体文件
【讨论】:
图库刷新,包括 Android KITKAT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
else
{
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
【讨论】:
以下内容仅在模拟器上进行了测试。 解决方案适用于 2.2 和 2.3,但不适用于 4。在第 4 个 Android 模拟器上,此操作对 LogCat 中的消息没有任何作用:
权限拒绝:广播意图
很遗憾,没有找到为 Android 4 更新媒体存储的方法 未在 Android 3 上测试。
该错误也发生在 2.3.3 Intel 映像中。没有在真实设备上检查过。
【讨论】: