Наблюдение изменений в наблюдателе содержимого 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();
не дает последних изменений. Так что любой другой метод для получения последних изменений
Ответы
Ответ 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();