web-dev-qa-db-fra.com

Imprimer le contenu d'un paquet pour Logcat?

Existe-t-il un moyen simple d’imprimer le contenu d’une Bundle dans Logcat si vous ne vous souvenez pas des noms de toutes les clés (même pouvoir imprimer uniquement les noms de clé serait bien)?

53
Quasaur

Bundle # keySet () devrait fonctionner.

for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}

Et si vous voulez obtenir l’objet, vous pouvez utiliser Bundle#get(String key) (qui se trouve également dans la même documentation que celle que j’ai liée en haut de ma réponse) . Cependant, gardez à l'esprit l'utilisation de l'appel générique get():

  • Vous travaillez avec Object. Si vous imprimez simplement dans un journal, toString() sera invoqué et tout ira bien. Toutefois, si vous souhaitez réellement utiliser la paire de clés, vous devez effectuer des contrôles instanceof pour éviter d'appeler la mauvaise méthode.
  • Étant donné que toString sera invoqué, si vous avez un objet spécial (par exemple, ArrayLists ou des extras spéciaux Serializable/Parcelable), vous n'obtiendrez probablement rien d’utile à l’impression.
93
A--C

Vous pouvez obtenir plus de détails en imprimant la valeur mappée comme suit:

for (String key : bundle.keySet())
{
    Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}
32
Phil

Convertisseur de paquet en chaîne:

public static String bundle2string(Bundle bundle) {
    if (bundle == null) {
        return null;
    }
    String string = "Bundle{";
    for (String key : bundle.keySet()) {
        string += " " + key + " => " + bundle.get(key) + ";";
    }
    string += " }Bundle";
    return string;
}

Exemple d'utilisation:

Log.d(TAG,"details="+bundle2string(details));

et sortie:

details=Bundle{ RESPONSE_CODE => 5; }Bundle

Notez que les flèches => et les points-virgules ; vous permettent de mentionner des espaces dans les clés et les valeurs. Un espace avant la flèche, un espace après la flèche, aucun espace avant le point-virgule, un espace après le point-virgule, un espace après { et un espace avant }; ou des valeurs.

19

Réalisez que cela ne répond pas exactement à la question, mais je vois beaucoup de développeurs qui essaient de vider le contenu vers logcat/console car ils ne savent pas qu'ils peuvent configurer le débogueur d'Android Studio pour afficher le rendu d'objet personnalisé au vous frappez un point de rupture. Et dans le cas de Bundle, vous pouvez utiliser le type de code indiqué dans les autres réponses ici et l'appliquer en tant que rendu personnalisé, de sorte que vous n'ayez pas besoin de rediriger le vidage vers logcat et/ou la console.

(Ces instructions proviennent de Android Studio 3.1.3 (juin 2018) ...

  1. Sélectionnez le "Fichier" puis l'option "Options" du menu "Paramètres".
  2. Dans la boîte de dialogue "Paramètres", sur la gauche, accédez à la vue "Construction, exécution, déploiement", "Débogueur", "Vues de données", "Rendu de type Java".
  3. A droite de la boîte de dialogue, où il est indiqué "Nom du générateur de rendu", entrez le nom que vous souhaitez identifier avec le convertisseur que vous créez.
  4. A droite de la boîte de dialogue, où il est indiqué "Appliquer le rendu aux objets de type", entrez "Android.os.Bundle".
  5. A droite de la boîte de dialogue, sous la section "Lors du rendu d'un nœud", sélectionnez le bouton radio "Utiliser l'expression suivante:".
  6. Dans le champ de texte ci-dessous, tapez ce qui suit ...
StringBuilder builder = new StringBuilder();
for (String key : ((Android.os.Bundle)this).keySet()) {
    Object value = ((Android.os.Bundle)this).get(key);
    builder.append("[");
    builder.append(key);
    builder.append("]=[");
    builder.append(value);
    builder.append("](");
    builder.append((value != null) ? value.getClass().getSimpleName() : "null");
    builder.append("), ");
}
return builder.toString();
  1. Appuyez sur le bouton 'Apply'/'OK'.

Désormais, lorsque vous exécutez votre application et que vous atteignez un point d'arrêt affichant une variable de type Android.os.Bundle, la sortie générée à partir du code ci-dessus s'affiche dans la section des variables de la fenêtre du débogueur.

Je vais également inclure une capture d'écran, montrant ce que j'ai décrit ci-dessus ...  screenshot

4
Adrian Romanelli

En Kotlin, récursif lorsqu'il contient des bundles enfants:

/**
 * Recursively logs the contents of a [Bundle] for debugging.
 */
fun Bundle.printDebugLog(parentKey: String = "") {
    if (keySet().isEmpty()) {
        Log.d("printDebugLog", "$parentKey is empty")
    } else {
        for (key in keySet()) {
            val value = this[key]
            when (value) {
                is Bundle -> value.printDebugLog(key)
                is Array<*> -> Log.d("printDebugLog", "$parentKey.$key : ${value.joinToString()}")
                else -> Log.d("printDebugLog", "$parentKey.$key : $value")
            }
        }
    }
}

Usage: myBundle.printDebugLog()

3
Frank

J'ai développé une bibliothèque appelée pretty-print dont le processeur d'annotation imprime le contenu du paquet au format Nice table . Vérifiez-le https://github.com/NULLPointerGuy/pretty-print

0
Karthik Rk

Une solution Kotlin:

val bundleFromNotifications: Bundle? = remoteMessage?.toIntent()?.extras
bundleFromNotifications?.keySet()?.forEach{
    Log.d(LOG_TAG, it + "=> \"" + bundleFromNotifications.get(it) + "\"")
}
0
ehivan24