2016-12-13 6 views
0

私はアンドロイドMediaStoreを使用して音楽アプリのオーディオファイルのリストを取得しています。これらのファイルはプレイリストに追加できます。ファイルがデバイスメモリから削除された場合、ファイル情報をプレイリストから削除する必要があります。Android:削除されたオーディオファイルを聴く

デバイスの内部/外部メモリからオーディオファイルが削除されたときにリッスンするリスナー/レシーバはありますか?

すべてのファイルの変更にはFileObserverを使用できます。しかし、これはバックグラウンドサービスが常に実行され、変更されたファイルをリッスンする必要がありました。私はこのためのサービスをしないようにしたい。他の方法はありますか?

+0

私は自分のアプリの中で非常に似たようなものを実装していますが、それがあなたが望むものかどうかはわかりません。基本的には、リスト内のすべての開始時に曲をリロードし、プレイリスト、キューなどをループして、リストにない曲を見つけて削除します。私は最良の解決策ではないことを知っていますが、私のために働いています。なぜなら、avgデバイスの曲の数はかなり少ないため、再読み込みはパフォーマンスにはほとんど影響しません。 –

+0

@ HarjotSinghOberai-ありがとう。私は同様のアプローチをしていますが、これは主にすべての曲がキュー/プレイリストにある場合に、アプリの開始を遅くします。 – Libin

+0

私は別の方法を考えていましたが、実装したことはありませんでした。アプリの起動時には何もしないでください。ただし、曲が再生されるたびに、MediaPlayerでデータソースを設定する前にそのパスを確認してください。パスが存在しない場合は、曲が削除されて次の曲にスキップし、バックグラウンドで再生リストやリストにある他の場所から曲を削除することがわかります –

答えて

1

MediaScannerイベント用にBroadcastReceiverを登録し、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); 

ローカルデータベースを削除しているアプリケーションは、変更後にMedia scannerを実行してメディアDBを同期する必要があるため、これを受け取る必要があります。

ただし、これはアプリケーションの実行中にのみ機能します。背景を削除するには、マニフェストに登録する必要があります。

DBを使用してプレイリストのエントリを格納する場合、これは、リフレッシュのために受け取ったパスLIKEパスを持つすべてのファイルをチェックできるので効率的です。

端末に大量のコンテンツが含まれているため、このイベントが遅れて受信されることがあります。

url MediaStore.Audio.Media.getContentUri( "external")とともにregisterContentObserverを呼び出すContentObserverを使用することもできます。すべてのメディアプロバイダにオーディオビューがあるので、これは効率的に機能するはずです。

関連する問題