gpt4 book ai didi

android - 检查 Intent.ACTION_VIEW 上的用户操作

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:37 27 4
gpt4 key购买 nike

我有一个包含一些文件的 ListView ,可以有各种类型,如 pdf 或文档。当用户单击一个文件时,我会得到文件 mime 类型并启动一个 Intent ,让用户选择使用哪个应用程序打开它file.What 我想知道的是用户选择了一些东西,或者简单地按下并没有选择任何东西。直到现在我尝试的是做一个 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 但仍然无济于事。我怎么知道用户是否选择了该列表中的某些内容,或者他是否取消了打开?

最佳答案

在 Android Developer 中写于 Activities

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

你不能指望 Action View 返回你所期望的,所以我所做的是实现一个自定义警报对话框,显示所有可以打开某个文件的可能应用程序,一个稍微修改过的版本,如图所示 Custom intent chooser

那些想知道的代码,它采用文件路径作为参数,并通过获取 mimetype 向您显示可以处理该文件类型的所有已安装应用程序。使用完整路径工作。可以用

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

这是一个类,它也可以接受一个可选的委托(delegate)来进行 Activity 回调

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

关于android - 检查 Intent.ACTION_VIEW 上的用户操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12744247/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com