Cómo hacer una intención con múltiples acciones
Quiero mostrar un selector de actividad que muestre todas las aplicaciones que pueden VER y / o EDITAR algunos datos. ¿Hay una manera fácil de hacer esto, o tengo que implementar mi propio diálogo del selector de la actividad? O tal vez sólo puedo subclase Intent
? Gracias.
- Android google play juegos seleccionar actividad para iniciar cuando se hace clic en la notificación
- Filtro de intenciones para capturar todos los intentos de uso compartido
- ¿Cómo eliminar la actividad de la lista de aplicaciones recientes al finalizar?
- ¿Cómo saber qué intención está seleccionada en Intent.ACTION_SEND?
- ¿Cómo elegir "cámara frontal" en la nueva intención?
- Android: Radio de red desactivada antes del evento ACTION_SHUTDOWN. Orden de cambios modificada en ICS
- Android, ¿Cómo llamar a onCreate () explícitamente de otro método?
- ¿Qué hace Intent.putExtra?
- Android Intent Data Parámetro de consulta Uri
- Intención de inicio para actividad-alias
- Intención - si la actividad se está ejecutando, llevarla al frente, de lo contrario iniciar una nueva (de la notificación)
- Diferencia entre Intent.ACTION_GET_CONTENT e Intent.ACTION_PICK
- Abrir un archivo seleccionado (imagen, pdf, ...) de forma programática de mi aplicación de Android?
Encontré una solución parcial utilizando EXTRA_INITIAL_INTENTS:
Intent viewIntent = new Intent(Intent.ACTION_VIEW); Intent editIntent = new Intent(Intent.ACTION_EDIT); viewIntent.setDataAndType(uri, type); editIntent.setDataAndType(uri, type); Intent chooserIntent = Intent.createChooser(editIntent, "Open in..."); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { viewIntent }); startActivity(chooserIntent);
Digo parcial porque si una aplicación soporta ACTION_VIEW y ACTION_EDIT se mostrará dos veces en la lista, una de las cuales se abrirá el archivo para su visualización y la otra para la edición, y no necesariamente saber cuál es cuál. Creo que una solución completa requeriría un selector de aplicaciones personalizado, como sugirió Tim.
EDIT (Solución completa!):
He encontrado una solución que no implica escribir un selector de aplicaciones personalizadas. Para diferenciar las aplicaciones ACTION_EDIT de las aplicaciones ACTION_VIEW, encontré una forma de añadir una cadena "(para editar)" a las etiquetas de una de ellas (en mi caso, ACTION_EDIT) usando la línea de código Tim proporcionada. Además, para asegurar que la cadena adjunta no aparezca como parte del nombre de la aplicación, cambié el color de la misma por cyan:
PackageManager pm = kyoPrint.getPackageManager(); Intent viewIntent = new Intent(Intent.ACTION_VIEW); Intent editIntent = new Intent(Intent.ACTION_EDIT); viewIntent.setDataAndType(uri, type); editIntent.setDataAndType(uri, type); Intent openInChooser = Intent.createChooser(viewIntent, "Open in..."); // Append " (for editing)" to applicable apps, otherwise they will show up twice identically Spannable forEditing = new SpannableString(" (for editing)"); forEditing.setSpan(new ForegroundColorSpan(Color.CYAN), 0, forEditing.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); List<ResolveInfo> resInfo = pm.queryIntentActivities(editIntent, 0); Intent[] extraIntents = new Intent[resInfo.size()]; for (int i = 0; i < resInfo.size(); i++) { // Extract the label, append it, and repackage it in a LabeledIntent ResolveInfo ri = resInfo.get(i); String packageName = ri.activityInfo.packageName; Intent intent = new Intent(); intent.setComponent(new ComponentName(packageName, ri.activityInfo.name)); intent.setAction(Intent.ACTION_EDIT); intent.setDataAndType(uri, type); CharSequence label = TextUtils.concat(ri.loadLabel(pm), forEditing); extraIntents[i] = new LabeledIntent(intent, packageName, label, ri.icon); } openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents); startActivity(openInChooser);
EDIT 2: ERROR
Si no hay actividades encontradas por la primera intención, NO se mostrarán actividades, incluyendo cualquiera que se encuentre en la segunda intención. Terminé escribiendo mi propio selector. Acabo de rellenar un ExpandableListView con encabezados para cada tipo de intención con sus respectivas actividades como hijos (almacenados como LabeledIntents individuales).
Depende de cuáles son sus datos. Pero en general, con ACTION_VIEW y algunos datos adjuntos puede utilizar un IntentChoooser para rellenar la lista de opciones para el usuario.
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, "some data"); startActivity(Intent.createChooser(intent, "Open with"));
Asegúrese de establecer su tipo correctamente para que las aplicaciones sabrán que está deseando abrir algo que pueden ser capaces de manejar.
EDIT: Creo que tendrías que usar una consulta de gestor de paquetes para obtener tus dos listas, luego combinarlas en una y crear tu propia actividad / diálogo que aparecerá y se rellenará con los datos contenidos en tu lista combinada.
Aquí hay un ejemplo de la consulta:
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(intent, 0);
Así que si haces tus dos intentos y lo llamas dos veces, pasando en cada intento deberías ser capaz de combinar las listas resultantes para obtener tu conjunto completo de posibilidades. Entonces está hasta para crear una actividad o un diálogo para demostrarlos con.