2012-10-05 57 views
8

Tengo una vista de lista poblada con algunos archivos, puede haber varios tipos como PDF o documentos. Cuando un usuario hace clic en uno obtengo el tipo de archivo mime y comienzo un intento que el usuario puede elegir qué aplicación usar para abrir ese archivo. Lo que quiero saber es si un usuario eligió algo, o simplemente presionó hacia atrás y no eligió nada. lo que he intentado hasta el momento estaba haciendo un startActivityForResult y la comprobación de éxito, pero siempre vuelve RESULT_CANCELEDCompruebe la acción del usuario en Intent.ACTION_VIEW

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 probé con un startActivityForResult (Intent.createChooser pero aún así fue en vano. ¿Cómo puedo saber si el usuario choosed algo en esa lista, o si canceló la intemperie?

Respuesta

6

Como está escrito en Android Developer en Activities

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

No se puede contar con puntos de vista de acción que devuelve lo que cabría esperar, así que lo que hice fue poner en práctica un diálogo de alerta personalizada que muestra todas las aplicaciones posibles que pueden abrir un determinado archivo, una versión ligeramente modificada, como se muestra aquí Custom intent chooser

Código para los que se preguntan, se necesita un rutaArchivo como parámetro y muestra todas las aplicaciones instaladas que pueden manejar ese tipo de archivo por conseguir los mimetype.Works con fullpaths.Can ser llamada con

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

esta es la clase , puede tomar una opción ional aswell delegado de devoluciones de llamada 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); 
} 
} 
-2

probar este ..

Intent intent = new Intent(Intent.ACTION_VIEW);  
     intent.setDataAndType(Uri.parse(filePath),mimetype); 
     startActivity(intent); 
+0

necesito saber si un el usuario hace clic en algo o cierra el diálogo – sokie

-2

tratar

si (== resultCode RESULT_CANCELED) en lugar de si (== resultCode Activity.RESULT_CANCELED)

Cuestiones relacionadas