Check user action on Intent.ACTION_VIEW

后端 未结 3 628
别跟我提以往
别跟我提以往 2021-01-05 01:06

I have a listview populated with some files,there can be various types like pdf or documents.When a user clicks on one i get the file mime type and start an intent that let\

相关标签:
3条回答
  • 2021-01-05 01:17

    try this..

    Intent intent = new Intent(Intent.ACTION_VIEW);     
            intent.setDataAndType(Uri.parse(filePath),mimetype);
            startActivity(intent);
    
    0 讨论(0)
  • 2021-01-05 01:23

    As written in Android Developer on Activities

    In other protocols (such as ACTION_MAIN or ACTION_VIEW), you may not get the result when you expect.

    You can't count on action views returning what you would expect,so what i did was implement a custom alert dialog that shows all possible applications that can open a certain file,a slightly modified version as shown here Custom intent chooser

    Code for those wondering,it takes a filePath as parameter and shows you all installed applications that can handle that filetype by getting the mimetype.Works with fullpaths.Can be called with

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

    this is the class,it can take an optional delegate aswell for activity callbacks

    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);
     }
    }
    
    0 讨论(0)
  • 2021-01-05 01:43

    try

    if (resultCode == RESULT_CANCELED) instead of if (resultCode == Activity.RESULT_CANCELED )

    0 讨论(0)
提交回复
热议问题