2012-10-05 23 views
8

Tôi có một listview được điền bằng một số tệp, có thể có nhiều loại khác nhau như pdf hoặc tài liệu. Khi người dùng nhấp vào một tôi lấy loại tệp mime và bắt đầu ý định mà người dùng chọn ứng dụng nào để sử dụng để mở tệp đó. Những gì tôi muốn biết là người dùng đã chọn một thứ gì đó hoặc chỉ cần nhấn lại và không chọn bất kỳ thứ gì. gì tôi đã cố gắng cho đến bây giờ đang làm một startActivityForResult và kiểm tra cho sự thành công, nhưng nó trả về luôn RESULT_CANCELEDKiểm tra hành động của người dùng trên 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 
     } 
    } 
} 

Tôi thậm chí đã cố gắng với một startActivityForResult (Intent.createChooser nhưng vẫn không có kết quả. Làm thế nào tôi có thể biết nếu người dùng chọn lựa một cái gì đó trong danh sách đó, hoặc nếu anh hủy mở?

Trả lời

6

Theo văn bản trong Android Developer trên Activities

Trong các giao thức khác (như ACTION_MAIN hoặc ACTION_VIEW), bạn có thể không nhận được kết quả khi bạn mong đợi.

Bạn không thể dựa vào quan điểm hành động trở lại những gì bạn mong đợi, vì vậy những gì tôi đã làm là thực hiện một hộp thoại cảnh báo tùy chỉnh cho thấy tất cả các ứng dụng có thể là có thể mở một tập tin nào đó, một phiên bản sửa đổi một chút như thể hiện ở đây Custom intent chooser

Mã cho những người tự hỏi, phải mất một filepath như tham số và cho bạn thấy tất cả các ứng dụng được cài đặt mà có thể xử lý filetype rằng bằng cách nhận được mimetype.Works với fullpaths.Can được gọi với

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

này là lớp , nó có thể mất một lựa chọn ional đại biểu là tốt cho callbacks hoạt động

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

thử này ..

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

tôi cần phải biết nếu một người dùng nhấp vào nội dung nào đó hoặc đóng hộp thoại – sokie

-2

thử

if (resultCode == RESULT_CANCELED) thay vì if (resultCode == Activity.RESULT_CANCELED)

Các vấn đề liên quan