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?
- No se pueden obtener intentos implícitos para trabajar
- Cómo llamar a la calculadora de Android en mi aplicación para todos los teléfonos
- Android: problema de intención
- Cómo iniciar una nueva actividad en android
- Android obtener la capacidad de la batería actual en mA y la capacidad total de la batería en mAh
- ¿Hay alguna manera de consultar un tipo específico de filtros de intención aplicaciones capaces?
- ¿Por qué no puedo pasar los datos a través de Intent?
- No se puede encontrar todos los dispositivos bluetooth android
- Haga clic en la notificación de Android mediante programación
- ¿Cómo enviar datos de una aplicación a otra aplicación en android?
- Apertura del cliente de correo electrónico a través de Intent (pero no para enviar un mensaje)
- OnActivityResult se llama cuando se inicia la actividad, no cuando se termina
- No se ha encontrado actividad para manejar la intención geográfica en el emulador
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);
- Android – problemas de SSL en el emulador de estudio de Android, funciona bien en el teléfono
- Detección de la cubierta S-View