在Audio.Media.EXTERNAL_CONTENT_URI Android内容观察者观察变化

2019-08-20 21:14发布

我正在开发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");
    }

}

这是为登记它的代码

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卡相关的音频文件。 但它不提供任何类型的有关的文件已经添加,编辑或删除信息的。

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

安卓:当连接了MTP如何检测MediaStore变化

在这篇文章中的一些代码是由Bhiefer给出一个答案,我认为它可以工作,所以我试图实现这一点,但我不能这样做。

我可以为此做些什么?

更新

我可以查询Audio.Media.EXTERNAL_CONTENT_URI其最新的变化? 此代码:

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

mCursor.moveToLast();

不给的最新变化。 是否有任何其他的方法来获得最新的变化?

Answer 1:

让我试着放松

ContentObserver

它不会给你什么发生了变化信息

这是每个设计。 在没有文件说,它会给你这个信息。

FileObserver

它是不是递归

是。 这是认识问题 。 什么是通过所有的目录遍历和设置观察员问题? 按我的默认理解不应该有很多(我们说一打左右)。

安卓:当连接了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是基于准确就可以了。

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



Answer 2:

You can get the latest additions/modifications by querying on the DATE_ADDED and DATE_MODIFIED columns, but you will NOT get DELETIONS.

Here is how I do it:

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


文章来源: Observing changes in Android content observer for Audio.Media.EXTERNAL_CONTENT_URI