Compruebe la acción del usuario en Intent.ACTION_VIEW

Tengo un listview poblado con algunos archivos, puede haber varios tipos como pdf o documents.When un usuario hace clic en uno i obtener el tipo de archivo mime y comenzar una intención que permite al usuario elegir qué aplicación para utilizar para abrir ese archivo. Quiero saber es un usuario eligió algo, o simplemente presionado de nuevo y no elegir nada. Lo que intenté hasta ahora era hacer un startActivityForResult y comprobar el éxito, pero siempre devuelve RESULT_CANCELED

static final int SELECTED_VIEWER = 1; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(filePath), mimetype); try { startActivityForResult(intent, SELECTED_VIEWER); }catch (ActivityNotFoundException e) { Toast.makeText(getActivity(), Strings.ERROR_NO_VIEWER, Toast.LENGTH_SHORT).show(); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SELECTED_VIEWER) { if (resultCode == Activity.RESULT_CANCELED ) { //do something } } } 

Incluso he intentado con un startActivityForResult (Intent.createChooser pero aún no sirve de nada ¿Cómo puedo saber si el usuario eligió algo en esa lista, o si canceló la apertura?

Según lo escrito en Android Developer on Activities

En otros protocolos (como ACTION_MAIN o ACTION_VIEW), es posible que no obtenga el resultado cuando se espere.

No puedes contar con las vistas de acción que devuelven lo que esperas, así que lo que hice fue implementar un diálogo de alerta personalizada que muestra todas las posibles aplicaciones que pueden abrir un determinado archivo, una versión ligeramente modificada como se muestra aquí.

Código para los que se preguntan, toma un filePath como parámetro y muestra todas las aplicaciones instaladas que pueden manejar ese tipo de archivo obteniendo el mimetype.Works con fullpaths.Can ser llamado con

 AlertDialogIntentChooser alertDialog = new AlertDialogIntentChooser(filePath,getActivity()); alertDialog.show(); 

Esta es la clase, puede tomar un representante opcional aswell para callbacks de actividad

 public class AlertDialogIntentChooser { private String filePath; private Activity activity; private AlertDialog dialog; private AlertDialogDelegate delegate; private ListItem[] items; public AlertDialogIntentChooser(String filePath,Activity activity){ this.filePath = filePath; this.activity = activity; init(); } public void setDialogDelegate(AlertDialogDelegate delegate){ this.delegate = delegate; } private void init(){ initApplicationItems(); AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(Strings.STRING_SELECT_APPLICATION); builder.setIcon(R.drawable.ic_share); builder.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface paramDialogInterface) { if(delegate!=null) delegate.onDialogCancelled(paramDialogInterface); } }); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intentPdf = new Intent(Intent.ACTION_VIEW); MimeTypeMap myMime = MimeTypeMap.getSingleton(); String fileExt = MimeTypeMap.getFileExtensionFromUrl(Uri.parse(filePath)); String mimeType = myMime.getMimeTypeFromExtension(fileExt); intentPdf.setClassName(items[which].context, items[which].packageClassName); intentPdf.setDataAndType(Uri.parse(filePath), mimeType); try { activity.startActivity(intentPdf); dialog.dismiss(); if(delegate!=null) delegate.onItemSelected(items[which].context, items[which].packageClassName); }catch (ActivityNotFoundException e) { Toast.makeText(activity, Strings.ERROR_NO_VIEWER, Toast.LENGTH_SHORT).show(); dialog.dismiss(); } } }); dialog = builder.create(); } private void initApplicationItems(){ Intent intentPdf = new Intent(Intent.ACTION_VIEW); MimeTypeMap myMime = MimeTypeMap.getSingleton(); String fileExt = MimeTypeMap.getFileExtensionFromUrl(Uri.parse(filePath)); String mimeType = myMime.getMimeTypeFromExtension(fileExt); intentPdf.setDataAndType(Uri.parse(filePath), mimeType); PackageManager pm = activity.getPackageManager(); List<ResolveInfo> resInfos = pm.queryIntentActivities(intentPdf, 0); items = new ListItem[resInfos.size()]; int i = 0; for (ResolveInfo resInfo : resInfos) { String context = resInfo.activityInfo.packageName; String packageClassName = resInfo.activityInfo.name; CharSequence label = resInfo.loadLabel(pm); Drawable icon = resInfo.loadIcon(pm); items[i] = new ListItem(label.toString(), icon, context, packageClassName); ++i; } } public void show(){ dialog.show(); } private ListAdapter adapter = new ArrayAdapter<ListItem>( activity, android.R.layout.select_dialog_item, android.R.id.text1, items){ public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); TextView tv = (TextView)v.findViewById(android.R.id.text1); int dpS = (int) (72 * activity.getResources().getDisplayMetrics().density * 0.5f); items[position].icon.setBounds(0, 0, dpS, dpS); tv.setCompoundDrawables(items[position].icon, null, null, null); int dp5 = (int) (5 * activity.getResources().getDisplayMetrics().density * 0.5f); tv.setCompoundDrawablePadding(dp5); return v; } }; class ListItem { public final String name; public final Drawable icon; public final String context; public final String packageClassName; public ListItem(String text, Drawable icon, String context, String packageClassName) { this.name = text; this.icon = icon; this.context = context; this.packageClassName = packageClassName; } @Override public String toString() { return name; } } public static interface AlertDialogDelegate{ public void onDialogCancelled(DialogInterface paramDialogInterface); public void onItemSelected(String packageName, String className); } } 

tratar

If (resultCode == RESULT_CANCELED) en lugar de if (resultCode == Activity.RESULT_CANCELED)

prueba esto..

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(filePath),mimetype); startActivity(intent); 
  • Cómo obtener el nombre de usuario, el teléfono y el correo electrónico de PayPal Mobile Payment Library
  • ¿Es posible ocultar una aplicación particular del usuario?
  • ¿Por qué resultCode = -1 aquí después de StartActivityForResult?
  • Android.intent.action.BOOT_COMPLETED La intención no se recibe en "Reiniciar" o "Reiniciar"
  • Android Intent: -Use Intención de pasar objetos de clase de Activities
  • ¿Qué es una emisión pegajosa?
  • Aplicación de los permisos de Android en la misma aplicación
  • Obtenga la lista de aplicaciones capaces de manejar la intención SEND de mostrar en una vista (no un cuadro de diálogo emergente)
  • Android "Tratar de pausar cuando la pausa ya está pendiente"
  • Registrarse como reproductor de música y reproducir canciones
  • Se pierde el envío de datos a la actividad principal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.