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.
- Cómo transferir valor booleano entre las actividades en android?
- Incorrectos extras recibidos con todos los intentos, pero el primero
- Modificar permanentemente el Intent que inició una Actividad
- Abrir navegador en la URL especificada mediante ACTION_VIEW no funciona cuando cromo es el navegador predeterminado
- datos putExtra que no pasan entre actividades
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(); } }
- Cómo abrir archivos privados guardados en el almacenamiento interno mediante Intent.ACTION_VIEW?
- Se muestra una pantalla blanca mientras se cambia entre Actividades
- Android EXTRA_MESSAGE no reconocido dentro de Recycler View Adapter
- ¿Enviar una difusión ordenada localmente (dentro de mi proceso)?
- Android: Iniciar una actividad para una aplicación de terceros diferente
- ¿Por qué excludeFromRecents elimina todas las actividades?
- Conexión profunda de Android a una aplicación
- El envío por correo electrónico de texto con formato HTML solo funciona con el cliente de Gmail
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; }
- Gradle build failed: Los archivos Dex no pueden superar los 64k
- Elemento RecyclerView que no muestra ondulaciones / retroalimentación táctil cuando el elemento tiene una casilla de verificación