检查Intent.ACTION_VIEW上的用户操作

我有一个列表视图填充了一些文件,可以有各种types,如PDF或文档。当用户点击一个我得到的文件MIMEtypes,并启动一个意图,让用户select使用哪个应用程序来打开该文件。我想知道的是用户select了什么东西,或者只是简单地按下而没有select任何东西。 我现在尝试的直到现在正在做一个startActivityForResult并检查成功,但它总是返回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 } } } 

我甚至尝试了一个startActivityForResult(Intent.createChooser,但仍然无济于事。我怎么知道用户是否在列表中select了某个东西,或者他是否取消了这个打开?

Solutions Collecting From Web of "检查Intent.ACTION_VIEW上的用户操作"

如Android Developer on Activities中所写

在其他协议(如ACTION_MAIN或ACTION_VIEW)中,如果您期望,可能无法得到结果。

你不能指望动作视图返回你所期望的,所以我做的是实现一个自定义的警报对话框,显示所有可能的应用程序,可以打开一个特定的文件,稍微修改的版本,如这里所示自定义意向select器

对于那些想知道的代码,它需要一个filePath作为参数,并显示所有可以处理该文件types的应用程序,通过获取具有完整path的mimetype.Works可以调用

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

这是类,它可以采取一个可选的代表以及活动callback

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

尝试这个..

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

尝试

if(resultCode == RESULT_CANCELED)而不是if(resultCode == Activity.RESULT_CANCELED)