Подтвердить что ты не робот

Наблюдение изменений в наблюдателе содержимого Android для Audio.Media.EXTERNAL_CONTENT_URI

Привет всем,

Извините, если вы думаете, что этот вопрос повторяется, но я задаю этот вопрос, потому что серьезно я не получаю решение для него.

На самом деле я разрабатываю приложение для Android, в котором я должен обнаруживать изменения в SD-карте android для аудиофайлов с именем файла, файловым путем и выполняемой над ним операцией. Пример, если я добавляю файл на свою 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");

Это дало мне знать, что некоторые изменения произошли в SD-карте, связанной с аудиофайлами. Но он не дает никакой информации о том, какой файл был добавлен, отредактирован или удален.

Затем я искал решение и получил это сообщение

Android: как обнаружить изменение в MediaStore при подключении через MTP

В этом сообщении некоторый код задается Bhiefer как ответ, который, я думаю, может работать. Поэтому я пытался реализовать, но я не могу этого сделать. У меня нет права комментировать где-либо в моей учетной записи. Поэтому я не могу связаться с Bhief e, чтобы попросить его о помощи.

Итак, кто-нибудь может предложить мне, что я могу сделать для этого. Если у кого-то есть какое-то решение для него или кто-нибудь, кто может мне помочь найти решение.

Буду очень признателен вам всем, если вы можете мне помочь.

Обновление Среда, 10 апреля 2013 года, 14:47:36 IST

Если кто-то знает методы для запроса Audio.Media.EXTERNAL_CONTENT_URI для своих последних изменений, это могло бы помочь, но

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

mCursor.moveToLast();

не дает последних изменений. Так что любой другой метод для получения последних изменений

4b9b3361

Ответ 1

Позвольте мне попытаться расслабиться

ContentObserver

Он не дает вам информации о том, что изменилось

Это за дизайн. Ничего в документации говорит, что он предоставит вам эту информацию.

FileObserver

Это не рекурсивный

Да. Он знает issue. В чем проблема с повторением всех каталогов и установкой наблюдателей? По моему пониманию по умолчанию не должно быть много (допустим, примерно дюжина).

Android: как обнаружить изменение в MediaStore при подключении через MTP

Код, который вы нашли, представляет собой только 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 основан именно на нем.

В любом случае оба этих подхода являются низкими и потребуют больше времени для выяснения.

Ответ 2

Вы можете получить последние дополнения/модификации, запросив столбцы DATE_ADDED и DATE_MODIFIED, , но вы НЕ получите DELETIONS.

Вот как я это делаю:

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