当前位置: 首页 > 知识库问答 >
问题:

如何使用intent.action_view和Uri打开精确应用程序

夏侯嘉荣
2023-03-14
 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)我可以筛选可以打开我的intent的应用程序,但是我如何选择确切的应用程序(缩放)并将uri传递给它,并且仅用我的会议URL打开缩放应用程序呢?

共有1个答案

沃盛
2023-03-14

可能需要一个PackageName?

在这篇文章中我引用了谷歌的一些代码

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应用程序,而不需要选择器。


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;
    }
 类似资料:
  • 问题内容: 我的应用程序将PDF打印到一个临时文件。如何使用Python中的默认应用程序打开该文件? 我需要一个解决方案 window Linux(如果没有更通用的功能,则使用带有Xfce的Ubuntu)。 问题答案: os.startfile暂时仅适用于Windows,但是xdg- open 将在运行X的任何UNIX客户端上可用。

  • 一段时间以来,我一直面临着一个关于星际触觉(意图)的问题。我正在开发的是一种关键字检测,比如“ok google”,当用户说出这个词时会触发警报。为了实现这一点,当用户不使用该应用程序时,我有一个LifecycleService在前台运行并听取用户的意见。当用户说出这个词并且应用程序被终止时,它会使用服务中的startActivity打开我需要的活动,但问题是,如果我一直在听并切换到其他活动(正常

  • 我正在使用Firebase(FCM)向用户显示推送通知,但我遇到了一个奇怪的问题。 我的代码适用于以下场景(使用FirebaseMessagingService): 前台应用 - 在 onReceive() 中接收数据并在应用内显示弹出窗口。 后台应用 - 在 onReceive() 中接收数据并为用户显示通知。如果单击此按钮,应用程序将被带回前台。在LauncherActivity中收到此目的的

  • 问题内容: 我正在尝试学习制作一个带有几个按钮的简单应用程序,每个按钮都打开另一个应用程序,从而消除了对其他应用程序的需求。我只是想不通。另外,我可以在此活动中放置多个按钮来打开另一个应用程序吗?我也找不到那个答案。 非常感谢您的帮助:D 问题答案: 希望此实现能够起作用: 唯一的事情是您必须事先安装该应用程序。

  • 问题内容: 我希望能够从终端中运行的node.js程序打开,创建一些内容,保存并退出,然后获取文件的内容。 我正在尝试做这样的事情: 但是,当它运行时,它只是将终端挂起。 我也尝试过,并得到相同的结果。 更新: 由于此过程是从运行readline的提示符下键入的命令启动的,因此使此过程变得复杂。我将最新版本的相关部分完全提取到了文件中。全文如下: 如上所示,它的工作方式是显示提示几秒钟,然后启动到

  • 我想做一个跑步应用程序,跟踪用户的位置、速度和跑步距离。目前,我正在使用谷歌定位服务API获取GPS数据,因为谷歌在官方网站上推荐它。 但问题是,我只能每10秒更新一次位置,如果只是在地图上绘制位置,这是可以的,但我想计算用户当前速度(公里/小时)、当前速度(分钟/米),并计算他跑一圈(1公里或1英里)的确切时间。问题是,如果我每10秒收到一次更新,我无法准确计算这些参数。例如,更新是在用户996