首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中创建一个自定义的"Open-With“对话框

在Android中创建一个自定义的"Open-With“对话框
EN

Stack Overflow用户
提问于 2012-10-12 22:43:27
回答 2查看 192关注 0票数 0

当我点击一个文件时,多个选项出现在“打开方式”对话框中。这是因为我用Action_VIEW发送了一个意图,并且有多个应用程序来接收它。

代码语言:javascript
复制
intent.setAction(android.content.Intent.ACTION_VIEW);
        Uri fileUri = Uri.parse("file://" + location);

出于安全原因,我想禁用其中一些,例如,用于从我的应用程序中打开文件的打印机应用程序。

是否有一种机制可以过滤出选项或选择要显示的选项?

EN

回答 2

Stack Overflow用户

发布于 2012-10-12 23:09:29

如果您知道应用程序名称,可以尝试使用SetPackage。例如,在代码中,可以使用setPackage指定包名

代码语言:javascript
复制
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setPackage("com.test.print");
Uri fileUri = Uri.parse("file://" + location);
票数 0
EN

Stack Overflow用户

发布于 2014-04-29 20:27:07

我回答了我的问题,因为它可以帮助任何人寻找类似的东西。因此,以下是您可以自定义和创建自己的Open With Dialog的方法:

步骤1:获取想要展示的App列表。为此,您需要从意图中筛选出应用程序。

代码语言:javascript
复制
final Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(fileUri, mimeType); 


List<ResolveInfo> getAllAppswhichcanViewtheFile =   (List<ResolveInfo>)getApplicationContext().getPackageManager().queryIntentActivities(intent, 0);

    Iterator<ResolveInfo> i = getAllAppswhichcanViewtheFile .iterator();
    while (i.hasNext()) {
        ResolveInfo file = i.next();

    // Use condition to filter the List 
        if (file.activityInfo.packageName.contains(XXXX)) {  
            i.next(); 
        } else {          
            i.remove();
        }

      List<ResolveInfo> resolvedPrintList = getAllAppswhichcanViewtheFile ;

第2步:在警报对话框中显示过滤的应用程序:

代码语言:javascript
复制
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(DataUtils.getString(R.string.xyz));
        final OpenWithArrayList adapter = new OpenWithArrayList(this,           R.layout.basiclistview, R.id.text1, resolvedPrintList);
        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                ResolveInfo info = (ResolveInfo)adapter.getItem(which);              

intent1.setClassName(info.activityInfo.packageName,info.activityInfo.name);startActivity(intent1);

代码语言:javascript
复制
             }             });
代码语言:javascript
复制
        builder.create();
        builder.show();  

步骤3:创建适配器:公共类OpenWithArrayList扩展ArrayAdapter{

代码语言:javascript
复制
    Context context;
    Object[] items;
    boolean[] arrows;
    int layoutId;





public OpenWithArrayList(Context context, int resource,
        int textViewResourceId, List<ResolveInfo> objects) {


    super(context, resource, textViewResourceId, objects);
    this.context = context;
    this.items = objects.toArray();
        this.layoutId = resource;

    // TODO Auto-generated constructor stub
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {

     View row = convertView;

     if(row==null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      row=inflater.inflate(R.layout.basiclistview,parent, false);
      TextView label=(TextView)row.findViewById(R.id.text1);
     label.setText(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadLabel(context.getPackageManager()).toString());
     ImageView image = (ImageView) row.findViewById(R.id.logo);
     image.setImageDrawable(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadIcon(context.getPackageManager()));

     }


     return(row);

}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12861501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档