观察Audio.Media.EXTERNAL_CONTENT_URI的Android内容观察者的更改

Nik*_*wal 12 android android-sdcard android-mediascanner contentobserver fileobserver

我正在开发一个Android应用程序,我必须检测Android SD卡中音频文件的变化,文件名,文件路径和执行的操作.例如,如果我在SD卡中添加文件,那么我想知道

  1. 添加的文件的名称
  2. 文件的路径
  3. 操作 - 添加

以前我已经尝试过文件观察器但是为此我必须在每个目录上应用它.所以我搜索了一些其他解决方案,并获得了有关Audio.Media.EXTERNAL_CONTENT_URI的信息.然后我创建了一个像这样的内容观察者

UriObserver.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");
    }

}
Run Code Online (Sandbox Code Playgroud)

这是注册的代码

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");
Run Code Online (Sandbox Code Playgroud)

它让我知道在与音频文件相关的SD卡中发生了一些变化.但它没有提供有关添加,编辑或删除哪个文件的任何信息.

然后我搜索了解决方案并得到了这篇文章

Android:如何通过MTP连接时检测MediaStore中的更改

在这篇文章中,Bhiefer给出了一些代码作为答案,我认为它可以起作用,所以我试图实现它,但我无法这样做.

我能为此做些什么?

更新

我可以查询Audio.Media.EXTERNAL_CONTENT_URI的最新更改吗?这段代码:

mCursor = context.getContentResolver().query(
                    Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, "_id");

mCursor.moveToLast();
Run Code Online (Sandbox Code Playgroud)

没有给出最新的变化.有没有其他方法来获得最新的变化?

Vic*_*nin 9

让我试着放松一下

ContentObserver

它没有提供有关已发生变化的信息

这是每个设计.文档中没有任何内容表明它会为您提供此信息.

FileObserver

它不是递归的

是.这是个问题.迭代所有目录和设置观察者有什么问题?根据我的理解,默认情况下不应该有很多(比方说十几个).

Android:如何通过MTP连接时检测MediaStore中的更改

您找到的代码只是包含在UriObserver中的ContentObserver.

它做了几件事

  • 他得到一个内容提供的光标(在他的情况下,我相信它是来自MediaStore的图像)

  • 他为此注册了一名观察员

  • 一旦发生某些变化,它就会将此更改转发给外部侦听器

但是,此解决方案有两个限制:

  • 它继承了ContentObserver的问题,它没有报告数据发生了什么.

  • 我相信它只会报告在此MediaStore内容提供商中注册的文件的更改.我相信系统只扫描SD卡上的特殊目录来检查图像等等.因此,如果文件将放在另一个目录中,则此解决方案将无法看到它.

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

摘要

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

更新1

结合更多想法,这可能不适合你.如果您可以root设备,那么您可以选择为文件系统编写过滤器驱动程序,因此每次更改某些内容时都会调用您的驱动程序.

你可以看一下这个链接:http: //www.gossamer-threads.com/lists/linux/kernel/355190

或者您可以重用一些现有的Linux更改通知系统.例如,看看这个:http: //stefan.buettcher.org/cs/fschange/.但是,FileObserver可能完全基于它.

无论如何,这两种方法都是低水平的,需要更多的时间来弄清楚.