android - 自定义选择 Intent 排除我自己的 Activity

标签 android android-intent

我有一个在 android list 中使用 ACTION_VIEW 操作设置为默认 Activity 的 Activity ,我想让 Activity 接收到我的应用程序的 http、https 等 url 类型的方案。看下面的代码

<activity
        android:name="com.test.ui.LinkLauncherActivity"
        android:label="@string/app_name" 
        android:excludeFromRecents="true"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.NoDisplay">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="http" />
            <data android:scheme="https"/>
        </intent-filter>
    </activity>
  • 现在在我的应用程序中,我可以选择共享链接,为此我 想用选定的应用程序打开选择 Intent 应该只 选择对话框中列出的排除我自己的应用程序。

  • 目前,当我使用操作查询包管理器时 (ACTION_VIEW) 它将返回我在其中的应用程序列表 找到我的包裹名称我只是忽略它并打开选择 Intent 但是 它仍然在自定义共享意向对话框中显示我的应用程序。

  • 是不是因为我在 list 中将类别定义为默认类别,如您在上面的代码中所见?

  • 让我们分享自定义 Intent 代码

    Uri uriUrl = Uri.parse(mlm.getHitUrl());
    //get package manager
    PackageManager pm = getPackageManager();
    
    Intent viewIntent = new Intent(Intent.ACTION_VIEW,uriUrl);
    
    List<ResolveInfo> resInfo = pm.queryIntentActivities(viewIntent, 0);
    
    List<LabeledIntent> intentList = new ArrayList<LabeledIntent>(resInfo.size() - 1); 
    
    for (int i = 0; i < resInfo.size(); i++) 
    {
        // Extract the label, append it, and repackage it in a LabeledIntent 
        ResolveInfo ri = resInfo.get(i);
    
        String packageName = ri.activityInfo.packageName;
    
        Log.d(getTag(),String.format("PackageName : %2s",packageName));
    
        if (!TextUtils.equals(packageName,"my application packageName")) {
    
            Intent intent = new Intent(Intent.ACTION_VIEW,uriUrl);
            intent.setPackage(packageName);
            intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
        }
    }
    
    // convert intentList to array 
    LabeledIntent[] extraIntents = intentList.toArray( new LabeledIntent[ intentList.size() ]);
    
    Intent openInChooser = Intent.createChooser(viewIntent, getResources().getString(R.string.intent_title_open_link));
    
    openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
    
    openInChooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    startActivity(openInChooser); 
    
  • 上面的代码仍然显示了我在 Intent 对话框中的应用程序。

最佳答案

试试这段代码。

Intent intent = new Intent();

    intent.setAction(android.content.Intent.ACTION_VIEW);

    MimeTypeMap mime = MimeTypeMap.getSingleton();

    String ext = file.getName().substring(file.getName().indexOf(".")+1);

    String type = mime.getMimeTypeFromExtension(ext);

    intent.setDataAndType(Uri.fromFile(file),type);

    PackageManager packageManager = activity.getPackageManager();

    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);

    String packageNameOfAppToHide = "com.test.app";

    ArrayList<Intent> targetIntents = new ArrayList<Intent>();

    for (ResolveInfo currentInfo : activities) {

            String packageName = currentInfo.activityInfo.packageName;

        if (packageNameToHide.equals(packageName)) {

            Intent targetIntent = new Intent(android.content.Intent.ACTION_VIEW);

            targetIntent.setDataAndType(Uri.fromFile(file),type);
            targetIntent.setPackage(packageName);
            targetIntents.add(targetIntent);
        }
    }
    if(targetIntents.size()>0) {

        Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), "Open file with");

        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));

        activity.startActivity(chooserIntent);
    }
    else
        Toast.makeText(this, "No app found", Toast.LENGTH_SHORT).show();

其中 com.test.app 是您的应用程序的包名称。

关于android - 自定义选择 Intent 排除我自己的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075319/

相关文章:

安卓工作室 : How can I get the aligned signed release APK?

存储在服务器上的 Android 应用程序数据 - 如何处理卸载?

android - 每个列表项打开不同的 Activity

java - 一个对话框中的 Android 日期时间选择器

android - 自定义通知

java - 从通知栏打开目录

android - 如何检测Android手机中的SIM卡变化?

android - 如何在 Android 中的 ACTION_CALL 之后返回到我的应用程序

android - 如何在 fragment 中实现 onBackPressed() 和 Intent ?

java - 每次请求 SharedPreference 时应用程序都会崩溃