2012-04-09 11 views
13

El siguiente fragmento, llamado desde mi implementación de onOptionsItemSelected(), funciona muy bien para llevar al usuario desde mi aplicación a un cliente de correo con la dirección de correo electrónico, el asunto y el cuerpo previamente rellenado. Estoy usando esto como una forma sencilla de dejar que el usuario me dé su opinión.¿Por qué Intent.createChooser() necesita un BroadcastReceiver y cómo implementarlo?

String uriText = 
    "mailto:" + emailAddress + 
    "?subject=" + subject + 
    "&body=" + body; 

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uriText)); 
startActivity(Intent.createChooser(emailIntent, "Pick an email app:")); 

Cuando se abra la aplicación de correo electrónico (en mi Nexus S con Android 4.0.4), LogCat muestra la siguiente información, y no puedo entender por qué; Google y SO busca createChooser unregisterReceiver parece infructuoso, y no puedo encontrar muchos ejemplos de createChooser() que también llamen a unregisterReceiver() de una manera que ayude a esta situación.

04-08 21: 26: 19.094: E/ActivityThread (27894): Actividad com.android.internal.app.ChooserActivity ha filtrado IntentReceiver [email protected] que fue originalmente registrado aquí ¿Te estás perdiendo una llamada para anular el registro de Receiver()?

04-08 21: 26: 19.094: E/ActivityThread (27894): android.app.IntentReceiverLeaked: Actividad com.android.internal.app.ChooserActivity ha filtrado IntentReceiver com.android.internal.app.ResolverActivity $ 1 @ 4150aac8 que se registró originalmente aquí. ¿Te estás perdiendo una llamada para anular el registro de Receiver()?

04-08 21: 26: 19.094: E/ActivityThread (27894): en android.app.LoadedApk $ ReceiverDispatcher (LoadedApk.java:763)

Esto se siente como un error de Android porque mi. propio código no llama al registerReceiver(), entonces ¿por qué Android se queja de que necesito llamar al unregisterReceiver()?

+0

estoy teniendo el mismo problema con mi nexo s 4.0.4 –

+0

¿Esto sucede en el emulador? De lo contrario, [esto] (https://groups.google.com/forum/?fromgroups#!topic/android-developers/POS_LeIim_U) podría estar relacionado. – trutheality

Respuesta

11

Veo esto también en mi Galaxy Nexus con 4.0.4, pero solo si solo hay una opción y el selector no aparece.

Este es un error en la fuente de Android, no hay mucho que pueda hacer al respecto. Su ResolverActivity registra un BroadcastReceiver, pero no siempre lo anula.

más detalle:

Intent.createChooser() iniciará una ResolverActivity. En onCreate(), llama a la actividad

mPackageMonitor.register(this, false); 

mPackageMonitor es un BroadcastReceiver y dentro register() se registra a sí mismo en la actividad. Normalmente, el receptor no está registrado en onStop(). Sin embargo, más adelante en onCreate(), el código verifica cuántas opciones puede elegir el usuario. Si solo hay uno, llama al finish(). Como se llama al finish() en onCreate(), los otros métodos del ciclo de vida nunca se llaman y salta directamente al onDestroy() - filtrando el receptor.

No vi un error para esto en la base de datos de problemas de Android, por lo que I created one.

Para más información se puede ver en este código:

Como nota al margen, Google utiliza el correo electrónico como un ejemplo de cuando no se quiere use un selector para que pueda considerar simplemente lanzar la intención normalmente. Ver los javadocs para Intent#ACTION_CHOOSER.

+0

¿Tiene una referencia de enlace para google diciendo que no use elegir para el correo electrónico? – Blundell

+0

Está en los javadocs para Intención # ACTION_CHOOSER. Puede usar el enlace de arriba o mirarlos en Eclipse. – blazeroni

+1

FYI, esto parece estar sucediendo en Android 4.4 independientemente de la cantidad de opciones que haya. Cambiar el tipo de intento a "text/html", por ejemplo, ayuda, pero también limita el número de aplicaciones que realmente se pueden compartir. ¿Alguna idea de por qué Android 4.4 está causando esto? – clu

4

Resolución simple del problema.

Más información aquí: https://developer.android.com/training/basics/intents/sending.html

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); 
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); 

PackageManager pkManager = getPackageManager(); 
List<ResolveInfo> activities = pkManager.queryIntentActivities(mapIntent, 0); 

if (activities.size() > 1) { 
    // Create and start the chooser 
    Intent chooser = Intent.createChooser(mapIntent, "Open with"); 
    startActivity(chooser); 

    } else { 
    startActivity(mapIntent); 
} 
Cuestiones relacionadas