我正在使用android MediaStore来获取我的音乐应用程序上的音频文件列表,这些文件可以添加到播放列表中。如果文件从设备内存中删除,则需要从播放列表中删除文件信息。当音频文件从设备内部/外部存储器中删除时,是否有任何收听器/接收器可供收听?我知道我们可以使用FileObserver来修改任何文件。但是这需要一个后台服务来一直运行和监听修改的文件。我想避免使用这样的服务。有没有其他方法?
MediaStore
FileObserver
kmbjn2e31#
您可以为MediaScanner事件注册BroadcastReceiver,并在收到Intent.ACTION_MEDIA_SCANNER_FINISHED Intent时刷新列表。
IntentFilter scanFileReceiverFilter= new IntentFilter(); scanFileReceiverFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); scanFileReceiverFilter.addDataScheme("file"); BroadcastReceiver scanFileReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) { Uri uri = intent.getData(); String path = null; if (uri != null) { path = uri.getPath(); } //TODO:refresh list in path } } }; getActivity().registerReceiver(scanFileReceiver, scanFileReceiverFilter);
任何正在删除本地数据的应用程序都应该在更改后运行媒体扫描程序,以同步媒体数据库,因此您应该收到此消息。但这只在你的应用程序运行时有效。对于后台删除,你应该在manifest中注册一个。如果你使用DB来存储播放列表条目,那么这将是有效的,因为你可以检查所有的文件与路径一样的路径接收刷新。请注意,有时由于设备中存在大量内容,此事件可能会延迟接收。您也可以使用ContentObserver通过uri MediaStore.Audio.Media.getContentUri(“external”)调用registerContentObserver。由于所有媒体提供程序都有音频视图,因此这应该可以有效地工作。
dgtucam12#
请尝试使用上下文注册内容观察器。getContentResolver.registerContentObserver(args).我在onResume中执行此操作().获取设备内存中的当前曲目数。我在onCreate中执行此操作()。还在onResume中的ContentObserver的onchanged方法中获取当前曲目数().如果数字不匹配,刷新当前列表。您还可以在服务中注册ContentObserver以获得一致的结果。另外,不要忘记在onPause中注销ContentObserver()和onDestroy()使用context.getContentResolver.unregisterContentObserver(args).工作起来很有魅力。我会在检索到代码后发布它。编码愉快!
2条答案
按热度按时间kmbjn2e31#
您可以为MediaScanner事件注册BroadcastReceiver,并在收到Intent.ACTION_MEDIA_SCANNER_FINISHED Intent时刷新列表。
任何正在删除本地数据的应用程序都应该在更改后运行媒体扫描程序,以同步媒体数据库,因此您应该收到此消息。
但这只在你的应用程序运行时有效。对于后台删除,你应该在manifest中注册一个。
如果你使用DB来存储播放列表条目,那么这将是有效的,因为你可以检查所有的文件与路径一样的路径接收刷新。
请注意,有时由于设备中存在大量内容,此事件可能会延迟接收。
您也可以使用ContentObserver通过uri MediaStore.Audio.Media.getContentUri(“external”)调用registerContentObserver。由于所有媒体提供程序都有音频视图,因此这应该可以有效地工作。
dgtucam12#
请尝试使用上下文注册内容观察器。getContentResolver.registerContentObserver(args).我在onResume中执行此操作().获取设备内存中的当前曲目数。我在onCreate中执行此操作()。还在onResume中的ContentObserver的onchanged方法中获取当前曲目数().如果数字不匹配,刷新当前列表。您还可以在服务中注册ContentObserver以获得一致的结果。另外,不要忘记在onPause中注销ContentObserver()和onDestroy()使用context.getContentResolver.unregisterContentObserver(args).工作起来很有魅力。我会在检索到代码后发布它。编码愉快!