Listado de todos los extras de un Intento

Por razones de depuración, quiero enumerar todos los extras (y sus valores) de un Intento. Ahora, obtener las llaves no es un problema

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

pero obtener los valores de las claves es uno para mí, porque algunos valores son cadenas, algunos son booleanos … ¿Cómo podría obtener los valores en un bucle (recorriendo las teclas) y escribir los valores en un archivo de registro? Gracias por cualquier pista!

Esto es lo que utilicé para obtener información sobre una intención indocumentada (de terceros):

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

(Asegúrese de comprobar si el bundle es nulo antes del ciclo)

Así es como defino el método de utilidad para volcar todos los extras de un Intento.

 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()) { String key = it.next(); Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]"); } Log.e(LOG_TAG,"Dumping Intent end"); } } 

Puedes hacerlo en una línea de código:

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

Muestra algo como:

“#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; end ”

Al final de esta cadena (la parte que en negrita) puede encontrar la lista de extras (solo una extra en este ejemplo).

Esto es según la documentación de toUri : “El URI contiene los datos de Intent como el URI base, con un fragmento adicional que describe la acción, las categorías, el tipo, las banderas, el paquete, el componente y los extras”.

El método get (String key) de Bundle devuelve un Objeto. Su mejor opción es girar el conjunto de teclas llamando a get (String) en cada tecla y usando toString () en el objeto para darles salida. Esto funcionará mejor para las primitivas, pero puede encontrarse con problemas con objetos que no implementan un toString ().

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

Puede usar for (String key : keys) { Object o = get(key); para devolver un Objeto, llame a getClass().getName() para obtener el tipo, y luego haga un conjunto de si name.equals (“String”) escribe las cosas para determinar a qué método debe llamar, en orden para obtener el valor?

Quería una forma de mostrar el contenido de un bash en el registro y poder leerlo fácilmente, así que esto es lo que se me ocurrió. LogUtil una clase LogUtil y luego tomé el método dumpIntent dumpIntent() @Pratik creado, y lo modifiqué un poco. Esto es lo que parece:

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

¡Espero que esto ayude a alguien!

Noté en la fuente de Android que casi todas las operaciones obligan al paquete a separar sus datos. Entonces, si (como yo) necesita hacer esto con frecuencia para fines de depuración, lo que sigue es muy rápido para escribir:

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

Lo siento si esto es demasiado detallado o demasiado tarde, pero esta fue la única forma que pude encontrar para hacer el trabajo. El factor más complicado fue el hecho de que java no tiene funciones de paso por referencia, por lo que los métodos get — Extra necesitan un retorno predeterminado y no pueden modificar un valor booleano para indicar si el valor predeterminado se devuelve o no por casualidad. o porque los resultados no fueron favorables Para este propósito, hubiera sido mejor que el método genere una excepción que hacer que devuelva un valor predeterminado.

Encontré mi información aquí: 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 string array 

Establecer la documentación

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

Si para depurar, todo lo que desea es una cadena (algo implícito en el OP pero no explícitamente establecido), simplemente use toString en el Bundle extras:

 intent.getExtras().toString() 

Devuelve una cadena como:

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

Documentación: Bundle.toString () (desafortunadamente es el javadoc Object.toString() predeterminado y, por lo tanto, bastante inútil aquí).