Liste de tous les extras d’une intention

Pour des raisons de débogage, je souhaite répertorier tous les extras (et leurs valeurs) d’une intention. Maintenant, obtenir les clés n’est pas un problème

Set keys = intent.getExtras().keySet(); 

mais obtenir les valeurs des clés en est une pour moi, car certaines valeurs sont des chaînes, d’autres sont booléennes … Comment puis-je obtenir les valeurs dans une boucle (en passant en revue les clés) et écrire les valeurs dans un fichier journal? Merci pour tout conseil!

Voici ce que j’ai utilisé pour obtenir des informations sur une intention non documentée (tierce partie):

 Bundle bundle = data.getExtras(); if (bundle != null) { for (Ssortingng key : bundle.keySet()) { Object value = bundle.get(key); Log.d(TAG, Ssortingng.format("%s %s (%s)", key, value.toSsortingng(), value.getClass().getName())); } } 

(Assurez-vous de vérifier si le bundle est nul avant la boucle)

C’est ainsi que je définis la méthode utilitaire pour transférer tous les extras d’une intention.

 import java.util.Iterator; import java.util.Set; import android.os.Bundle; public static void dumpIntent(Intent i){ Bundle bundle = i.getExtras(); if (bundle != null) { Set keys = bundle.keySet(); Iterator it = keys.iterator(); Log.e(LOG_TAG,"Dumping Intent start"); while (it.hasNext()) { Ssortingng key = it.next(); Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]"); } Log.e(LOG_TAG,"Dumping Intent end"); } } 

Vous pouvez le faire en une seule ligne de code:

 Log.d("intent URI", intent.toUri(0)); 

Il génère quelque chose comme:

“#Intent; action = android.intent.action.MAIN; category = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; component = com.mydomain.myapp / .StartActivity; sourceBounds = 12% 20870% 20276% 201167; l .profile = 0; fin ”

A la fin de cette chaîne (la partie en gras), vous pouvez trouver la liste des extras (un seul supplémentaire dans cet exemple).

Ceci est conforme à la documentation de toUri : “L’URI contient les données de l’Intent comme URI de base, avec un fragment supplémentaire décrivant l’action, les catégories, le type, les indicateurs, le package, le composant et les extras.”

La méthode get (Ssortingng key) de Bundle renvoie un object. Votre meilleur pari est de survoler l’ensemble de clés appelant get (Ssortingng) sur chaque clé et en utilisant toSsortingng () sur l’object pour les sortir. Cela fonctionnera mieux pour les primitives, mais vous pouvez rencontrer des problèmes avec les objects qui n’implémentent pas un toSsortingng ().

 private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tv = new TextView(this); tv.setText("Extras: \n\r"); setContentView(tv); SsortingngBuilder str = new SsortingngBuilder(); Bundle bundle = getIntent().getExtras(); if (bundle != null) { Set keys = bundle.keySet(); Iterator it = keys.iterator(); while (it.hasNext()) { Ssortingng key = it.next(); str.append(key); str.append(":"); str.append(bundle.get(key)); str.append("\n\r"); } tv.setText(str.toSsortingng()); } } 
 Bundle extras = getIntent().getExtras(); Set ks = extras.keySet(); Iterator iterator = ks.iterator(); while (iterator.hasNext()) { Log.d("KEY", iterator.next()); } 

Vous pouvez utiliser for (Ssortingng key : keys) { Object o = get(key); pour retourner un object, appelez getClass().getName() pour obtenir le type, puis faites un ensemble de choses de type if name.equals (“Ssortingng”) pour déterminer la méthode à appeler, dans l’ordre pour obtenir la valeur?

Je voulais un moyen de sortir le contenu d’une intention dans le journal et de pouvoir le lire facilement, alors voici ce que j’ai trouvé. J’ai créé une classe LogUtil , puis dumpIntent() pris la méthode dumpIntent dumpIntent() créée par LogUtil et je l’ai LogUtil modifiée. Voici à quoi ça ressemble:

 public class LogUtil { private static final Ssortingng TAG = "IntentDump"; public static void dumpIntent(Intent i){ Bundle bundle = i.getExtras(); if (bundle != null) { Set keys = bundle.keySet(); SsortingngBuilder ssortingngBuilder = new SsortingngBuilder(); ssortingngBuilder.append("IntentDump \n\r"); ssortingngBuilder.append("-------------------------------------------------------------\n\r"); for (Ssortingng key : keys) { ssortingngBuilder.append(key).append("=").append(bundle.get(key)).append("\n\r"); } ssortingngBuilder.append("-------------------------------------------------------------\n\r"); Log.i(TAG, ssortingngBuilder.toSsortingng()); } } } 

J’espère que cela aide quelqu’un!

J’ai remarqué dans la source Android que presque toutes les opérations obligent Bundle à décompresser ses données. Donc, si (comme moi) vous devez le faire fréquemment à des fins de débogage, le texte ci-dessous est très rapide à taper:

 Bundle extras = getIntent().getExtras(); extras.isEmpty(); // unparcel System.out.println(extras); 

Désolé si c’est trop verbeux ou trop tard, mais c’était le seul moyen que je pouvais trouver pour faire le travail. Le facteur le plus compliqué a été le fait que java n’a pas de fonctions de référence, de sorte que les méthodes get — Extra nécessitent une valeur par défaut pour retourner et ne peuvent pas modifier une valeur booléenne pour indiquer si la valeur par défaut est renvoyée par hasard. ou parce que les résultats n’étaient pas favorables. À cette fin, il aurait été préférable de faire déclencher une exception par la méthode plutôt que de la rendre par défaut.

J’ai trouvé mes informations ici: Android Intent Documentation .

  //substitute your own intent here Intent intent = new Intent(); intent.putExtra("first", "hello"); intent.putExtra("second", 1); intent.putExtra("third", true); intent.putExtra("fourth", 1.01); // convert the set to a ssortingng array 

Définir la documentation

  Ssortingng[] anArray = {}; Set extras1 = (Set) intent.getExtras().keySet(); Ssortingng[] extras = (Ssortingng[]) extras1.toArray(anArray); // an arraylist to hold all of the ssortingngs // rather than putting ssortingngs in here, you could display them ArrayList endResult = new ArrayList(); for (int i=0; i 

Si pour déboguer tout ce que vous voulez, c’est une chaîne (sorte de sous-jacente impliquée par l’OP mais pas explicitement indiquée), utilisez simplement toSsortingng sur le Bundle supplémentaire:

 intent.getExtras().toSsortingng() 

Il retourne une chaîne telle que:

 Bundle[{key1=value1, key2=value2, key3=value3}] 

Documentation: Bundle.toSsortingng () (c’est malheureusement le javadoc Object.toSsortingng() par défaut et en tant que tel assez inutile ici.)