对不起,如果你认为这个问题重复,但是我提出这个问题,因为我没有得到解决方案.
其实我正在开发一个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完全基于它.
无论如何,这两种方法都是低水平的,需要更多的时间来弄清楚.