观察Android content observer for Audio.Media.EXTERNAL_content_URI的变化

观察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——这是一个内容观察者

我正在开发一个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卡上的特殊目录来检查图像等等。因此,如果一个文件将被放置在另一个目录中,这个解决方案将看不到它

    那么,你对他的密码有什么疑问

    摘要

    在这种情况下,如果您想知道scdard上所有文件的确切更改类型,我认为您找不到比FileObserver更好的方法

    更新1

    多考虑一些可能不适合你的想法。如果您可以根设备,那么您可以选择为文件系统编写筛选器驱动程序,因此每次发生更改时都会调用您的驱动程序

    您可以查看此链接:

    或者您可以重用一些现有的linux更改通知系统。例如,请看以下内容: . 然而,FileObserver可能正是基于它


    无论如何,这两种方法都是低级的,需要更多的时间来解决。

    您可以通过查询“添加的日期”和“修改的日期”列来获得最新的添加/修改,但您不会得到删除

    我是这样做的:

    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,你能找到一个满足观察者方面的解决方案吗。因为文件观察器甚至是递归的,在最新的设备上都不起作用。