2016-12-13 12 views
0

Я использую android MediaStore, чтобы получить список аудиофайлов в моем музыкальном приложении, и эти файлы могут быть добавлены в список воспроизведения. Если файл удаляется из памяти устройства, информация о файле должна быть удалена из списка воспроизведения.Android: прослушать аудиофайл удален

Есть ли приемник/приемник для прослушивания, когда аудиофайлы удаляются из внутренней/внешней памяти устройства?

Я знаю, что мы можем использовать FileObserver для любого смены файла. Но для этого потребовалось фоновое обслуживание, чтобы всегда запускать и прослушивать измененный файл. Я хочу избежать службы для этого. Есть ли другой путь?

+0

Я реализовал что-то очень похожее в одном из моих приложений, я не знаю, это то, что вы хотите. В основном я перезагружаю песни на каждом стартах в списке и просматриваю списки воспроизведения, очередь и т. Д. И нахожу песни, которые больше не входят в список, и удаляем их. Я знаю, что это не самое лучшее решение, но работало для меня, потому что количество песен в устройстве avg довольно мало, поэтому перезагрузка не очень сильно влияет на производительность. –

+0

@ HarjotSinghOberai- Спасибо. У меня был аналогичный подход, но это замедлит начало приложения, главным образом, в случае, если все песни находятся в очереди/плейлисте. – Libin

+0

У меня был другой подход, но я никогда не реализовал его. Не делайте ничего при запуске приложения, но всякий раз, когда воспроизводится песня, проверьте путь до установки источника данных в MediaPlayer. Если путь не существует, то вы знаете, что песня была удалена и, таким образом, перейти к следующей песне и в фоновом режиме, удалить песню из списков воспроизведения или в любом другом месте, где она была указана –

ответ

1

Вы можете регистрировать события BroadcastReceiver для MediaScanner и обновлять свой список всякий раз, когда получаете Intent.ACTION_MEDIA_SCANNER_FINISHED намерение.

IntentFilter scanFileReceiverFilter= new IntentFilter(); 
scanFileReceiverFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); 
scanFileReceiverFilter.addDataScheme("file"); 

BroadcastReceiver scanFileReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      if(intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) { 
       Uri uri = intent.getData(); 
       String path = null; 
       if (uri != null) { 
        path = uri.getPath(); 
       } 
       //TODO:refresh list in path 

      } 
     } 
    }; 
getActivity().registerReceiver(scanFileReceiver, scanFileReceiverFilter); 

Любое приложение, которое удаляет локальные данные, как ожидается, запустить медиа сканер после изменения, чтобы синхронизировать медиа-DB, так что вы должны получить это.

Но это работает только во время работы вашего приложения. Для удаления фона вы должны зарегистрировать его в манифесте.

Если вы используете БД для записи записей плейлистов, то это будет эффективно, так как вы можете проверить все файлы с путём LIKE path, полученным для обновления.

Обратите внимание, что иногда это событие может быть получено позднее из-за огромного количества контента, присутствующего на устройстве.

Вы также можете использовать ContentObserver для вызова registerContentObserver с uri MediaStore.Audio.Media.getContentUri («внешний»). Поскольку все медиа-провайдеры имеют аудио-представление, это должно работать эффективно.