2016-12-13 4 views
0

J'utilise android MediaStore pour obtenir la liste des fichiers audio sur mon application de musique et ces fichiers peuvent être ajoutés à la playlist. Si le fichier est supprimé de la mémoire de l'appareil, les informations sur le fichier doivent être supprimées de la liste de lecture.Android: Écoutez le fichier audio supprimé

Y a-t-il un écouteur/récepteur à écouter lorsque les fichiers audio sont supprimés de la mémoire interne/externe du périphérique?

Je sais que nous pouvons utiliser FileObserver pour tout changement de fichier. Mais cela nécessitait un service en arrière-plan pour toujours exécuter et écouter le fichier modifié. Je veux éviter d'avoir un service pour ça. Est-ce qu'il y a un autre moyen?

+0

J'ai implémenté quelque chose de très similaire dans l'une de mes applications, je ne sais pas si c'est ce que vous voulez. Fondamentalement, je recharge des chansons à chaque démarrage dans une liste, et boucle à travers les listes de lecture, la file d'attente etc. et trouve des chansons qui ne sont plus dans la liste, et les supprime. Je sais que ce n'est pas la meilleure solution, mais a fonctionné pour moi, parce que, le nombre de chansons dans un appareil avg sont moins, donc rechargement n'affecte pas la performance beaucoup –

+0

@ HarjotSinghOberai- Merci. J'ai une approche similaire, mais cela ralentira le démarrage de l'application, surtout si toutes les chansons sont dans la file d'attente/playlist. – Libin

+0

J'avais une autre approche dans mon esprit, mais je ne l'ai jamais implémentée. Ne faites rien au démarrage de l'application, mais chaque fois qu'une chanson est jouée, vérifiez son chemin avant de définir la source de données dans MediaPlayer. Si le chemin n'existe pas, alors vous savez, que la chanson a été supprimée et donc passer à la chanson suivante et en arrière-plan, supprimer la chanson des listes de lecture ou de tout autre endroit où il a été listé –

Répondre

1

Vous pouvez enregistrer un BroadcastReceiver pour les événements MediaScanner et actualiser votre liste chaque fois que vous recevez l'intention 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); 

Toute application qui supprime les données locales devrait fonctionner scanner Media après que les modifications, à synchroniser les médias DB, vous devriez recevoir cela.

Mais cela ne fonctionne que lorsque votre application est en cours d'exécution. Pour la suppression d'arrière-plan, vous devez en enregistrer un dans le manifeste.

Si vous utilisez DB pour stocker des entrées de listes de lecture, cela sera efficace car vous pouvez vérifier tous les fichiers avec le chemin LIKE chemin d'accès pour l'actualisation.

Veuillez noter que parfois cet événement peut être reçu en retard en raison de l'énorme quantité de contenu présent dans l'appareil.

Vous pouvez également utiliser ContentObserver en appelant registerContentObserver avec uri MediaStore.Audio.Media.getContentUri ("externe"). Comme tous les fournisseurs de médias ont une vue audio, cela devrait fonctionner efficacement.