2012-10-05 5 views
8

Ich habe eine Liste mit einigen Dateien gefüllt, es kann verschiedene Arten wie PDF oder Dokumente geben. Wenn ein Benutzer auf einen klickt, bekomme ich die Datei MIME-Typ und starten eine Absicht, die der Benutzer wählen kann welche Anwendung zu verwenden, um diese Datei zu öffnen.Was ich will, ist zu wissen, ist ein Benutzer etwas gewählt, oder drückte einfach zurück und wählte nichts. Was ich versuchte, bis jetzt ein startActivityForResult und Erfolgskontrolle tat, aber esBenutzeraktion auf Intent.ACTION_VIEW überprüfen

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 
     } 
    } 
} 

ich sogar versucht, mit einem startActivityForResult (Intent.createChooser aber noch ohne Erfolg gibt immer RESULT_CANCELED. Wie kann ich das wissen, ob Benutzer choosed etwas auf dieser Liste, oder wenn er die offene abgesagt?

Antwort

6

Wie in Android Developer geschrieben auf Activities

In anderen Protokollen (wie ACTION_MAIN oder ACTION_VIEW) erhalten Sie das Ergebnis möglicherweise nicht erwartungsgemäß.

Sie nicht auf Aktion Ansichten Rückkehr zählen kann, was man erwarten würde, also was ich tat, war eine benutzerdefinierte Benachrichtigung Dialog implementieren, die alle möglichen Anwendungen zeigt, die eine bestimmte Datei, eine leicht modifizierte Version wie hier Custom intent chooser gezeigt öffnen

-Code für diejenigen fragen, die ihm einen filePath als Parameter übernimmt und zeigt Ihnen alle installierten Anwendungen, die diese Datei des Typs, indem sie die mimetype.Works mit fullpaths.Can umgehen kann dies mit

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

genannt werden, ist die Klasse kann es ein opt ional Delegierten aswell für Aktivität Rückrufe

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

dies versuchen ..

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

Ich muss wissen, ob ein Der Benutzer klickt auf etwas oder schließt den Dialog – sokie

-2

versuchen

if (Result == RESULT_CANCELED) statt if (Result == Activity.RESULT_CANCELED)

Verwandte Themen