【问题标题】:Android App link - Open a url from app in browser without triggering App LinkAndroid 应用程序链接 - 在浏览器中打开应用程序的 url 而不会触发应用程序链接
【发布时间】:2020-11-30 19:25:54
【问题描述】:

我已在我的应用程序中启用应用程序链接。它工作正常。但是在我的应用程序中,在某些情况下我无法处理传入的 url。在这些情况下,我想将该 url 重定向到设备中的默认浏览器。

目前我尝试做的是使用意图打开带有 url 的浏览器,但它再次重定向到我的应用程序本身。应用链接的格式为 ->

https://<domain>/<prefix>/<params>

所以根据参数,我想在应用程序本身中处理应用程序链接或将其重定向到默认浏览器。以下是我尝试使用上述网址打开浏览器的代码

val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(appLinkModel.url))
browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER)
browserIntent.resolveActivity(packageManager)?.let {
    startActivity(browserIntent)
}

我尝试排除 addCategory() 行,但结果相同。应用程序崩溃(因此是 resolveActivity()),或者应用程序在循环中打开自身。

我想做什么

所以我想要做的是将 url 重定向到默认浏览器(或在其中显示一个选择器 WITHOUT 我的应用程序),而不是一次又一次地触发应用程序链接。那么这可能吗?

【问题讨论】:

    标签: android deep-linking android-app-links


    【解决方案1】:
    String data = "example.com/your_url?param=some_param";
    Intent defaultBrowser = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_BROWSER);
    defaultBrowser.setData(data);
    startActivity(defaultBrowser);
    

    这种技术(使用 makeMainSelectorActivity)将强制链接在设备的默认浏览器中打开

    注意 - makeMainSelectorActivity 仅适用于 API 级别 15 及以上。

    如果您需要支持低于 15 的 API 级别,可以尝试this hack

    【讨论】:

      【解决方案2】:

      Kotlin,尝试使用makeMainSelectorActivity

      val defaultBrowser = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_BROWSER)
      defaultBrowser.data = Uri.parse("https://yoururl.com/")
      startActivity(defaultBrowser)
      

      【讨论】:

        【解决方案3】:
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://stackoverflow.com/questions/58800240/android-app-link-open-a-url-from-app-in-browser-without-triggering-app-link"));
                Intent chooseIntent = Intent.createChooser(intent, "Choose from below");
                startActivity(chooseIntent);
        

        这将打开所有已安装的网络浏览器供用户选择!

        【讨论】:

        • 我已经试过了。由于应用程序链接,这只是重定向回我的应用程序本身。
        【解决方案4】:

        很遗憾,我们无法排除任何特定的 URL,因为 Android 不提供该选项。

        但是你可以使用路径前缀来处理。

        // To handle:
        http://myhost.com/v/page1?id=123
        // To exclude:
        http://myhost.com/v/page2?id=123
        

        然后在清单中

        <data android:scheme="http"
              android:host="myhost.com"
              android:pathPrefix="/v/page1" />
        

        【讨论】:

        • 对不起。我不能用这个。因为在 url 中唯一的变化是“param”部分。并且根据参数我必须决定是在应用程序还是浏览器中处理它。
        • 尝试在自定义 chrome 选项卡中打开
        猜你喜欢
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 2016-01-10
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多