Propósito de envoltura en LabeledIntent para fines de visualización

Los requisitos:

Tengo un botón de "compartir" en mi aplicación. Tengo un requisito para compartir a través de Facebook. Necesito tener la opción si la aplicación nativa de Facebook está o no instalada. Nuestra decisión es enviar al usuario a facebook.com para compartir si la aplicación no está instalada.

El estado actual:

Puedo detectar cuando la aplicación nativa no está instalada (a través del nombre del paquete) y agregar intentos adicionales al selector.

El problema:

El elemento que el usuario tiene que seleccionar para compartir a través de "Sitio Web de Facebook" dice, "Navegador" y tiene el icono del navegador de Android. El elemento LabeledIntent no aparece y obtengo una "Ninguna actividad encontrada para Intent {act = android.intent.action.VIEW dat = …}

El Código (simplificado …):

Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_SUBJECT, "check this out"); intent.putExtra(Intent.EXTRA_TEXT, urlToShare); boolean facebookInstalled = false; Intent chooser = Intent.createChooser(intent, "Share this link!"); if (!facebookInstalled) { Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/sharer/sharer.php?u=" + Uri.encode(urlToShare))); Intent niceUrlIntent = new LabeledIntent(urlIntent, context.getApplicationContext().getPackageName(), "Facebook's Website", R.drawable.icon); // Ideally I would only add niceUrlIntent in the end, but that doesn't add anything to the chooser as-is chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[urlIntent, niceUrlIntent]); } context.startActivity(chooser); 

La solución

La solución que @CommonsWare señaló, es utilizar el LabeledIntent para envolver una intención que va a una nueva actividad que crear, que simplemente envía una intención ACTION_VIEW a la Uri adecuada.

 Intent myActivity = new Intent(context, ViewUriActivity.class); myActivity.putExtra(ViewUriActivity.EXTRA_URI, "http://..."); Intent niceUrlIntent = new LabeledIntent(myActivity, context.getApplicationContext().getPackageName(), "Facebook's Website", R.drawable.icon); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{niceUrlIntent}); 

El ViewUriActivity se ve así:

 public final class ViewUriActivity extends Activity { public static final String EXTRA_URI = ViewUriActivity.class.getSimpleName() + "EXTRA_URI"; protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getIntent().getExtras().getString(EXTRA_URI))); startActivity(urlIntent); finish(); } } 

Aunque indocumentado, parece que LabeledIntents sólo funciona en intentos resueltos. Por lo tanto, a menos que la intención ya tenga definida una actividad y un paquete específicos, no podrá utilizarlo.

Esto no es sorprendente, ya que puede haber muchas Actividades que pueden ser resueltas para un LabeledIntent y su chooserActivity mostrará todos los iconos y nombres como iguales.

Así que en su caso usted tendrá que resolver la acctivity primero y luego usar LabeledIntent. Pero esto podría resultar en que el usuario no pueda elegir el navegador de su elección. Utilice debajo de la función para obtener LabeledIntent de su intención.

 Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/sharer/sharer.php?u=" + Uri.encode(urlToShare))); Intent niceUrlIntent = getLabelintent(urlIntent, "Facebook's Website", R.drawable.icon); 

Y getLabelIntent

 public LabeledIntent getLabelintent(Intent in, String name, int drawable) { PackageManager pm = getPackageManager(); ComponentName launchname = in.resolveActivity(pm); if (launchname != null) { Intent resolved = new Intent(); resolved.setComponent(launchname); resolved.setData(in.getData()); LabeledIntent niceUrlIntent = new LabeledIntent(resolved, getPackageName(), name, drawable); return niceUrlIntent; } return null; } 
  • OnActivityResult obtener RESULT_CANCELLED cuando se utiliza Intent.EXTRA_ALLOW_MULTIPLE
  • ¿Puede una actividad de Android llamarse a sí misma?
  • Eliminar Contacto seleccionar opción formulario seleccionar opciones
  • Android onActivityResult se llama temprano
  • Android PendingIntent. El botón Atrás cierra la aplicación en lugar de restaurar la actividad anterior de la pila
  • Múltiples actividades compitiendo una intención
  • Eliminar el botón de aplicación reciente como se hace en la aplicación SureLock
  • USER_PRESENT Propósito de GO Locker
  • Captura e interceptación de ACTION_SEND intents en Android
  • Haz que el botón "arriba" se comporte como el botón "volver" de Android
  • Android Share via Intent Texto no mostrado en Facebook
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.