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.

  • Qu'est-ce qu'une activité non intégrée et pourquoi l'Android ne fonctionne-t-il pas: fitsSystemWindows?
  • Définition de la sonnerie sur Android
  • Ajout de ActionBar à l'application Android API 8?
  • Comment activer l'écran partagé dans mon application Android
  • Comment commentez-vous une règle dans Proguard.cfg?
  • Comment créer un effet de compte à rebours pour une visualisation de texte dans Android
  • 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

  • Android Studio ne génère pas d'applet aligné sur zip
  • Android Studio - option VM non reconnue 'MaxPermSize = 256m'
  • Animer les éléments desséchables à deux couches Pre-Honeycomb
  • Android. CSipSimple. Comment intégrer l'appel vidéo dans le projet?
  • Comment spécifier la taille de dialogue correcte dans le fichier de mise en page XML pour la boîte de dialogue Android?
  • Première version avec AndroidStudio failed
  • 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.