观察Audio.Media.EXTERNAL_CONTENT_URI的android内容观察器的更改

大家好,

对不起,如果你认为这个问题重复,但是我提出这个问题,因为我没有得到解决方案.

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

>添加文件名称
>文件的路径
>操作 – 添加

以前我已经尝试过文件观察器,但是我必须在每个目录上应用它.所以我搜索了一些其他解决方案,并得到关于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");
    }

}

这是注册代码

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");

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

然后我搜索解决方案,并得到这个职位

Android: How to detect a change in MediaStore when connected over MTP

在这文章中,一些代码由Bhiefer作为一个答案,我认为它可以工作所以我试图实现,但我不能这样做.我没有任何地方在我的堆栈溢出帐户的任何地方的评论的特权所以我不能联系Bhiefe要求他一些帮助.

所以任何人都可以建议我该怎么做如果任何身体有一些解决方案或任何人谁​​可以指导我如何找到解决方案.

如果你能帮助我,我将非常感谢你们.

更新2013年4月10日星期三14:47:36 IST

如果有人知道用于查询Audio.Media.EXTERNAL_CONTENT_URI的最新更改的方法,它可以帮助,但是

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

mCursor.movetoLast();

没有给出最新的更改所以任何其他方法来获得最新的更改

解决方法

让我试着放松吧

ContentObserver

它没有给你关于什么变化的信息

这是每个设计. documentation没有什么可以告诉你这个信息.

FileObserver

它不是递归的

是.知道issue.迭代所有目录和设置观察者有什么问题?根据我认的理解,不应该有很多(可以说十几个).

Android:如何通过MTP连接时检测MediaStore的变化

你发现的代码只是ContentObserver包裹在UriObserver中.

它做了几件事情

>他获得一个内容提供的光标(在他的情况下,我相信它是MediaStore的图像)
注册一个观察员
>一旦发生了一些变化,它会将此更改转发给外部监听器

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

>它具有ContentObserver的继承问题,它不会报告数据发生了什么.
>我相信它只会报告在本MediaStore内容提供商中注册文件的更改.我相信系统只扫描SD卡上的特殊目录,以检查图像等.所以,如果一个文件将放在另一个目录中,这个解决方案就不会看到它.

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

概要

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

更新1

结合更多的想法,这可能不适合你.如果您可以根设备,那么您可以选择为文件系统编写过滤器驱动程序,因此,每当有变化时,您的驱动程序将被调用.

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

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

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...