【问题标题】:How to open exact app with Intent.ACTION_VIEW and Uri如何使用 Intent.ACTION_VIEW 和 Uri 打开确切的应用程序
【发布时间】:2021-05-03 04:13:46
【问题描述】:

我正在尝试通过将 uri 传递给下面的意图来打开缩放应用程序,它工作正常。

 val intent = Intent(Intent.ACTION_VIEW, Uri.parse("<zoom url>"))
 val packageManager = packageManager
 if (intent.resolveActivity(packageManager) != null) {
     startActivity(launchApp)
 }

但这也显示了我的浏览器,因为用户可以选择它并打开我传递的 uri。我想做的只是用uri打开缩放应用程序。 通过使用val activities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY),我可以过滤可以打开我的意图的应用程序,但我如何选择确切的应用程序(缩放)并将 uri 传递给它并仅使用我的会议 URL 打开缩放应用程序?

【问题讨论】:

    标签: java android kotlin android-intent android-implicit-intent


    【解决方案1】:

    可能需要一个包名?

    我在this中引用了谷歌的一些代码

    public static void openCustomTab(Activity activity,
                                         CustomTabsIntent customTabsIntent,
                                         Uri uri,
                                         CustomTabFallback fallback) {
            String packageName = CustomTabsHelper.getPackageNameToUse(activity);
    
            //If we cant find a package name, it means theres no browser that supports
            //Chrome Custom Tabs installed. So, we fallback to the webview
            if (packageName == null) {
                if (fallback != null) {
                    fallback.openUri(activity, uri);
                }
            } else {
                customTabsIntent.intent.setPackage(packageName);
                customTabsIntent.launchUrl(activity, uri);
            }
        }
    

    它使用setPackage(),然后应用程序将打开没有选择器的chrome应用程序。

    这是getPackageNameToUse的方法

    
    static final String STABLE_PACKAGE = "com.android.chrome";
    static final String BETA_PACKAGE = "com.chrome.beta";
    static final String DEV_PACKAGE = "com.chrome.dev";
    static final String LOCAL_PACKAGE = "com.google.android.apps.chrome";
    
    ...
    ...
    
    public static String getPackageNameToUse(Context context) {
            if (sPackageNameToUse != null) return sPackageNameToUse;
    
            PackageManager pm = context.getPackageManager();
            // Get default VIEW intent handler.
            Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
            ResolveInfo defaultViewHandlerInfo = pm.resolveActivity(activityIntent, 0);
            String defaultViewHandlerPackageName = null;
            if (defaultViewHandlerInfo != null) {
                defaultViewHandlerPackageName = defaultViewHandlerInfo.activityInfo.packageName;
            }
    
            // Get all apps that can handle VIEW intents.
            List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
            List<String> packagesSupportingCustomTabs = new ArrayList<>();
            for (ResolveInfo info : resolvedActivityList) {
                Intent serviceIntent = new Intent();
                serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
                serviceIntent.setPackage(info.activityInfo.packageName);
                if (pm.resolveService(serviceIntent, 0) != null) {
                    packagesSupportingCustomTabs.add(info.activityInfo.packageName);
                }
            }
    
            // Now packagesSupportingCustomTabs contains all apps that can handle both VIEW intents
            // and service calls.
            if (packagesSupportingCustomTabs.isEmpty()) {
                sPackageNameToUse = null;
            } else if (packagesSupportingCustomTabs.size() == 1) {
                sPackageNameToUse = packagesSupportingCustomTabs.get(0);
            } else if (!TextUtils.isEmpty(defaultViewHandlerPackageName)
                    && !hasSpecializedHandlerIntents(context, activityIntent)
                    && packagesSupportingCustomTabs.contains(defaultViewHandlerPackageName)) {
                sPackageNameToUse = defaultViewHandlerPackageName;
            } else if (packagesSupportingCustomTabs.contains(STABLE_PACKAGE)) {
                sPackageNameToUse = STABLE_PACKAGE;
            } else if (packagesSupportingCustomTabs.contains(BETA_PACKAGE)) {
                sPackageNameToUse = BETA_PACKAGE;
            } else if (packagesSupportingCustomTabs.contains(DEV_PACKAGE)) {
                sPackageNameToUse = DEV_PACKAGE;
            } else if (packagesSupportingCustomTabs.contains(LOCAL_PACKAGE)) {
                sPackageNameToUse = LOCAL_PACKAGE;
            }
            return sPackageNameToUse;
        }
    

    也许对你有帮助。

    【讨论】:

    • 谢谢。 setPackage() 是我没想到的。
    • 我认为zoom的官方人员会很乐意提供他们的包名!还是通过一些反编译工具?
    • 是的,可能是。但我们可以通过queryIntentActivities()获得这些信息
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2018-07-31
    • 1970-01-01
    • 2014-05-30
    • 2017-01-10
    • 2015-06-07
    相关资源
    最近更新 更多