观察Android content observer for Audio.Media.EXTERNAL_content_URI的变化
我正在开发一个Android应用程序,在这个应用程序中,我必须检测Android SD卡中音频文件的更改,包括文件名、文件路径和对其执行的操作。例如,如果我正在SD卡中添加一个文件,那么我想知道观察Android content observer for Audio.Media.EXTERNAL_content_URI的变化,android,android-sdcard,contentobserver,android-mediascanner,fileobserver,Android,Android Sdcard,Contentobserver,Android Mediascanner,Fileobserver,我正在开发一个Android应用程序,在这个应用程序中,我必须检测Android SD卡中音频文件的更改,包括文件名、文件路径和对其执行的操作。例如,如果我正在SD卡中添加一个文件,那么我想知道 添加的文件的名称 文件的路径 操作—添加 以前我尝试过file observer,但为此我必须在每个目录上应用它。因此,我搜索了一些其他解决方案,并获得了关于Audio.Media.EXTERNAL\u CONTENT\u URI的信息。然后我创建了一个这样的内容观察者 java——这是一个内容观察者
class UriObserver extends ContentObserver {
public UriObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
Log.d("INSTANT", "GETTING CHANGES");
}
}
这是它的注册代码
UriObserver observer = new UriObserver(new Handler());
Log.d("INSTANT", "registered content observer");
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,
observer);
Log.d("INSTANT", "registered content observer");
它让我知道,SD卡中与音频文件相关的内容发生了一些变化。但它并没有给出任何关于哪个文件被添加、编辑或删除的信息
然后我寻找解决方案,得到了这个帖子
在这篇文章中,Bhiefer给出了一些代码,作为一个答案,我认为这是可行的,所以我试图实现它,但我无法实现
我能为此做些什么
更新
我可以查询Audio.Media.EXTERNAL\u CONTENT\u URI以了解其最新更改吗?此代码:
mCursor = context.getContentResolver().query(
Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, "_id");
mCursor.moveToLast();
不提供最新的更改。有没有其他方法可以获得最新的更改?让我试着放松一下
ContentObserver
它不会告诉你发生了什么变化
这是每种设计。中没有任何内容说明它会提供此信息
FileObserver
它不是递归的
对。这是我知道的。遍历所有目录并设置观察者有什么问题?根据我的理解,默认情况下不应该有很多(比如说一打左右)
Android:通过MTP连接时如何检测MediaStore中的更改
您找到的代码只是用UriObserver包装的ContentObserver
它可以做几件事
- 他为其中一个内容提供了一个光标(在他的情况下,我相信这是来自MediaStore的图像)
- 他为此登记了一名观察员
- 一旦发生某些更改,它就会将这些更改转发给外部侦听器
- 它继承了ContentObserver的问题,即它不报告数据发生了什么
- 我相信它只会报告在此MediaStore内容提供商中注册的文件的更改。我相信系统只扫描SD卡上的特殊目录来检查图像等等。因此,如果一个文件将被放置在另一个目录中,这个解决方案将看不到它
无论如何,这两种方法都是低级的,需要更多的时间来解决。您可以通过查询“添加的日期”和“修改的日期”列来获得最新的添加/修改,但您不会得到删除 我是这样做的:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
long lastDatabaseUpdateTime = preferences.getLong("lastDatabaseUpdateTime", 0);
long newDatabaseUpdateTime = (new Date()).getTime();
String[] cols = new String[] {MediaStore.Audio.Media._ID /* and other columns */};
String where = "("+MediaStore.MediaColumns.DATE_ADDED + ">" + (lastDatabaseUpdateTime/1000);
where += " or " + MediaStore.MediaColumns.DATE_MODIFIED + ">" + (lastDatabaseUpdateTime/1000);
where += ") and "+MediaStore.Audio.AudioColumns.IS_MUSIC+"==1 ";
Cursor cursor = MusicUtils.query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cols, where, null, null);
/* Do my work on the cursor and close the cursor */
//If no exceptions, then save the new timestamp
SharedPreferences.Editor editor = preferences.edit();
editor.putLong("lastDatabaseUpdateTime", newDatabaseUpdateTime);
editor.commit();
但我必须在所有目录上实现文件观察程序。这将是一个漫长的过程。@Nikhil:这取决于目录的数量。如果有成百上千的话,那就要花很长时间。然而,对于Android Sd卡,通常没有那么多文件夹。顺便说一句,你试过这么做吗?它会使设备变慢吗?是的,我的16GB sd卡中有1500多个文件夹。而且它消耗了更多的资源,使我的设备速度变慢。这就是为什么我要尝试这个选项我会给你这个+50的声誉,因为在发布了这么多开发者门户网站后,你只会引导我进入下一个层次来回答我的问题,但它还没有完成。因此,如果您遇到与此问题相关的任何其他信息,请更新您的答案。其他人认为这篇文章对他们有帮助,如果你们遇到任何其他与这个问题相关的信息,请在这篇文章中发表你们的答案。谢谢维克多·罗宁,请随时保持联系。多亏了stackoverflow,我们善良和天才的版主,以及这个社区所有伟大的聪明和专业的成员。嗨,我面临着同样的问题,你有什么解决方案吗?嗨@Nikhi Agrawal,你能找到一个满足观察者方面的解决方案吗。因为文件观察器甚至是递归的,在最新的设备上都不起作用。