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.

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); 

Introduzca aquí la descripción de la imagen

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.

  • Android - getIntent (). GetStringExtra () devuelve null
  • ¿Cómo obtengo datos adicionales de intenciones en Android?
  • Ver la ruta del archivo en un gestor de archivos según la intención de Android
  • Abrir archivo adjunto .txt de correo electrónico en la aplicación para Android
  • WARN / ActivityManager (5038): Permiso denegado: checkComponentPermission
  • ¿Qué es createChooser cuando tengo que usar Intents? ¿Qué podría hacer con este método?
  • Se pierde el envío de datos a la actividad principal
  • Android: setResult no funciona
  • Android - Uso de Google Analytics v4 Campaign Measurement
  • Android reconocimiento de voz: startActivityForResult () no funciona
  • ¿Por qué excludeFromRecents elimina todas las actividades?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.