【问题标题】:How to exclude a specific application from ACTION_VIEW Intent?如何从 ACTION_VIEW Intent 中排除特定应用程序?
【发布时间】:2013-09-12 00:47:36
【问题描述】:

我正在尝试在浏览器中加载 Twitter URL。

在我的手机中,我也已经安装了 twitter 应用程序。我正在尝试使用 ACTION_VIEW 意图打开 URL。但是发生的情况是,当我调用意图时,android 将显示默认选择器对话框,其中还包含 twitter 应用程序(如果它安装在设备上)。我只想使用浏览器打开 URL。 我想从对话框中排除 Twitter 应用程序。我希望设备中所有可用的浏览器都显示在对话框中,而不是 twitter、facebook 等原生应用程序。

有没有可能?如果可能的话,任何人都可以帮助我实现它。为了清楚起见,我还附上了我的代码和屏幕截图以及这个问题。

String url = "https://twitter.com";
MimeTypeMap map = MimeTypeMap.getSingleton();
String type = map.getMimeTypeFromExtension(url);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setType(type);
i.setData(Uri.parse(url));
startActivity(i);

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    我需要做类似的事情,发现this 回答很有帮助。我已经对其进行了修改,使其成为一个完整的解决方案:

    public static void openFileWithInstalledAppExceptCurrentApp(File file, final Activity activity) {
        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 packageNameToHide = "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();
        }
    }
    

    【讨论】:

    • 您在packageNameToHide.equals(packageName) 之前忘记了!。现在它总是以 packageNameOfAppToHide 打开。
    • @DalvikVM 感谢您的建议。你们俩都写。我修正了错误。 :)
    • @lf215 抱歉,您的编辑在我批准之前已被拒绝。我已经进行了更正。谢谢。 :)
    • 我当前的应用仍然在选择器中列出。我不得不添加这一行来修复它:targetIntent.setComponent(new ComponentName(packageName, currentInfo.activityInfo.name));
    • 为什么是remove(0)
    【解决方案2】:

    你只需要将目标包设置为intent:

    String url = "https://twitter.com";
    MimeTypeMap map = MimeTypeMap.getSingleton();
    String type = map.getMimeTypeFromExtension(url);
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setType(type);
    i.setData(Uri.parse(url));
    ComponentName comp = new ComponentName("com.android.browser", "com.android.browser.BrowserActivity");
    i.setComponent(comp);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    

    但是,如果用户安装了一些自定义浏览器并希望将其用作默认浏览器,我会感到不安。

    您可以尝试通过以下方式检测默认浏览器:

    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://example.com"));
    List<ResolveInfo> list = context.getPackageManager()
        .queryIntentActivities(i, 0);
    // walk through list and select your most favorite browser
    

    【讨论】:

    • 没有区别,仍然显示相同的视图。我对你的代码做了一个小的改动。我不知道它是否需要。这显示了我设备中的几乎所有应用程序。
    • 这里是修改后的代码。我评论了设置数据和类型。字符串 url = "twitter.com"; MimeTypeMap 映射 = MimeTypeMap.getSingleton();字符串类型 =map.getMimeTypeFromExtension(url);意图 i = new Intent(Intent.ACTION_VIEW); //i.setType(type); //i.setData(Uri.parse(url)); //ComponentName comp = new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"); ComponentName comp = new Intent(type, Uri.parse(url)).resolveActivity(this.getPackageManager()); i.setComponent(comp); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i);
    • 您正在向系统询问可以处理“twitter.com”的应用程序列表,其中包括 twitter 应用程序。这就是我选择google.com 进行测试的原因。
    • 我知道。当你给 google.com 时,它不会显示 twitter。但我想要的是当我使用 twitter url 时,我希望它在浏览器而不是 twitter 应用程序中打开。
    • 再次:这就是为什么我要求 ComponentName 处理google.com,在您的情况下这是 IntentChooser。使用我的第一个建议,它会打开浏览器。
    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 2016-02-20
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多