Suivre les changements dans l'observateur de contenu Android pour Audio.Media.EXTERNAL_CONTENT_URI

Bonjour à tous ,

Désolé si vous pensez que cette question est répétée, mais je pose cette question parce que sérieusement je n'obtiens pas la solution.

  • Services Google Play: Comment gérer les appareils qui n'ont pas Google Play?
  • ViewPager avec plusieurs instances de fragment de même classe
  • Les composants invisibles occupent toujours de l'espace
  • Comment puis-je diviser une chaîne par rupture de ligne?
  • Échec de gradle lorsque Theme déclare-styleable dans deux bibliothèques
  • Comment arrêter un fil?
  • En fait, je développe une application Android dans laquelle je dois détecter les modifications apportées à la carte Android sd pour les fichiers audio avec le nom du fichier, le chemin du fichier et le fonctionnement effectué. Exemple si j'ajoute un fichier dans ma carte SD puis je veux savoir

    1. Nom du fichier qui est ajouté
    2. Chemin du fichier
    3. Fonctionnement – Ajouter

    Auparavant, j'ai essayé l'observateur de fichier. Mais pour cela, je dois l'appliquer sur chaque répertoire. J'ai donc recherché une autre solution et j'ai eu l'information sur Audio.Media.EXTERNAL_CONTENT_URI . Ensuite, j'ai créé un observateur de contenu comme celui-ci

    UriObserver.java – qui est un observateur de contenu

    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"); } } 

    C'est le code pour l'inscription

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

    Il me fait savoir que certains changements se sont produits dans la carte sd associée aux fichiers audio. Mais il ne donne aucune information sur le fichier qui a été ajouté, modifié ou supprimé.

    Ensuite, j'ai cherché une solution et obtenu cette publication

    Android: comment détecter une modification dans MediaStore lorsqu'il est connecté via MTP

    Dans cette publication, un code est donné par Bhiefer comme une réponse qui, je pense, pourrait fonctionner. J'ai donc essayé de mettre en œuvre, mais je ne suis pas capable de le faire. Je n'ai pas le privilège de commenter n'importe où dans mon compte de débordement de pile. Donc, je ne peux pas contacter Bhief e pour lui demander de l'aide.

    Donc, n'importe qui pourrait me suggérer ce que je peux faire pour cela. Si un organe a une solution pour lui ou quelqu'un qui peut me guider pour trouver sa solution.

    Je vous serai très reconnaissant si vous pouvez m'aider.

    Mise à jour mercredi 10 avril 2013, 14:47:36 IST

    Si quelqu'un connait des méthodes pour interroger Audio.Media.EXTERNAL_CONTENT_URI pour ses dernières modifications, cela pourrait aider mais

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

    Ne donne pas les dernières modifications Donc, toute autre méthode pour obtenir les derniers changements

  • Les tests JUnit d'Android ne fonctionnent pas
  • Comment supprimer un contact par programme dans Android
  • Quelle est la différence entre l'utilisation de WebView et le navigateur pour YouTube Video api?
  • Les lignes directrices sur les noms de domaine privés Android sont correctes?
  • Comment puis-je obtenir mon site mobile mobile à largeur fixe pour toujours apparaître "entièrement agrandi"?
  • Fragments et notifications: cible différentes activités de la notification; Selon la configuration de l'écran
  • 2 Solutions collect form web for “Suivre les changements dans l'observateur de contenu Android pour Audio.Media.EXTERNAL_CONTENT_URI”

    Permettez-moi d'essayer de vous détendre

    ContentObserver

    Il ne vous donne aucune information sur ce qui a changé

    C'est par conception. Rien dans la documentation ne dit que cela vous donnera cette information.

    FileObserver

    Ce n'est pas récursif

    Oui. C'est un problème connu. Quel est le problème avec l'itération de tous les répertoires et des observateurs? Par mon compréhension par défaut, il ne devrait pas y avoir beaucoup (disons une douzaine d'environ).

    Android: comment détecter une modification dans MediaStore lorsqu'il est connecté via MTP

    Le code que vous avez trouvé est simplement ContentObserver emballé dans UriObserver.

    Il fait plusieurs choses

    • Il obtient un curseur pour l'un des contenus fournis (dans son cas, je crois que ce sont les images de MediaStore)

    • Il enregistre un observateur pour cela

    • Dès que certains changements se produisent, cela change à l'auditeur externe

    Cependant, cette solution a deux limitations:

    • Il a hérité du problème de ContentObserver qu'il ne signale pas ce qui est arrivé aux données.

    • Je crois qu'il ne signaler que les modifications apportées aux fichiers enregistrés dans ce fournisseur de contenu MediaStore. Je crois que le système ne scanne que les répertoires spéciaux sur la carte SD pour vérifier les images, etc. Donc, si un fichier sera situé dans un autre répertoire, cette solution ne le verra pas.

    Alors, quelle était votre question sur son code?

    Résumé

    Dans le cas, si vous souhaitez connaître le type de modifications exactes pour TOUS les fichiers sur scdard, je ne pense pas que vous pouvez trouver quelque chose de mieux que FileObserver

    Mise à jour 1

    Joignez plus d'idées, ce qui peut ne pas convenir à vous. Si vous pouvez rayer un périphérique, vous avez la possibilité d'écrire un pilote de filtre pour un système de fichiers, de sorte que votre conducteur sera appelé chaque fois que quelque chose a changé.

    Vous pouvez consulter ce lien: http://www.gossamer-threads.com/lists/linux/kernel/355190

    Ou vous pouvez réutiliser certains systèmes de notifications de changement de linux existants. À titre d'exemple, regardez ceci: http://stefan.buettcher.org/cs/fschange/ . Cependant, il se pourrait que FileObserver soit basé exactement sur celui-ci.

    Quoi qu'il en soit, ces deux approches sont de faible niveau et nécessiteront plus de temps pour comprendre.

    Vous pouvez obtenir les derniers ajouts / modifications en interrogeant sur les colonnes DATE_ADDED et DATE_MODIFIED, mais vous ne recevrez PAS DE SUPPRESSION .

    Voici comment je le fais:

     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(); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.