【问题标题】:Open an Android app via a URL in the browser通过浏览器中的 URL 打开 Android 应用
【发布时间】:2015-05-30 13:01:08
【问题描述】:

好的,所以我知道肯定不止这些。我在这里读过很多答案,都说同样的话,但这对我不起作用。我希望能够使用来自浏览器的自定义 URL 方案的链接打开一个 Android 应用程序。首先,我使用的是模拟器(实际上是 Genymotion),所以我不知道这是否与它有关。我看到的答案一直在说我所需要的只是与此类似的东西:

<intent-filter>
    <data android:scheme="myapp" android:host="hello"/>
    <action android:name="ANDROID.INTENT.ACTION.VIEW"/>
    <category android:name="ANDROID.INTENT.CATEGORY.BROWSABLE"/>
    <category android:name="ANDROID.INTENT.CATEGORY.DEFAULT"/>
</intent-filter>

我把它放在一个新的空白活动上,而不是主要活动上。

如果我理解正确,任何以myapp://hello 开头的 URL 都将使用该意图过滤器打开活动。但是,无论我尝试什么,我都会在浏览器中不断收到 ERR_UNKNOWN_URL_SCHEME。这是库存的 Android 浏览器,因为我无法将 Chrome 放在 Genymotion 上(至少不是免费版本)。这是需要 Chrome 的东西吗?这是只能在实际设备上完成的事情吗?是不是我做错了什么?

【问题讨论】:

  • ANDROID.INTENT.ACTION 和 ANDROID.INTENT.CATEGORY 必须小写
  • 好的,就是这样。我一开始就没有意识到这一点,我感到很愚蠢。但是,如果您开始在所有大写字母中输入最后一部分(如“VIEW”),Android Studio 显然会将整个字符串插入大写字母中,即使代码完成以小写形式显示它也是如此。谢谢!
  • 是的,这是 IDE 的一个错误。不客气

标签: android intentfilter


【解决方案1】:

这里有几件事在起作用。

首先,正如 Blackbelt 所说,Android 是区分大小写的,大多数编程语言和开发环境也是如此。您需要根据这些操作和类别的文档将其更改为正确的情况:

<intent-filter>
    <data android:scheme="myapp" android:host="hello"/>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

其次,并非所有的 Web 浏览器都可以处理像 myapp:// 这样的方案。我不知道任何司法管辖区的书籍上有任何法律强制开发商遵守它们。您将遇到三种基本模式:

  • 某些浏览器可能处理得很好

  • 某些浏览器会在页面链接中使用此类 URL 时处理它们,但在地址栏中键入 URL 时不会处理

  • 一些浏览器不会尝试找到一个 Activity 来处理它们,只是一直失败

Google 的首选替代方案是让您使用 httphttps 方案,主机和路径由您控制。一些浏览器总是会打开网页,但其他浏览器会检查,发现有一个活动支持该 URL,并让用户选择如何处理它。 “M”版本的 Android 将提供更多可以绕过选择器的钩子 ("App Links")。此外,其他应用程序(例如,短信客户端、电子邮件客户端)通常会使http 链接可点击,从而允许用户选择打开您的应用程序,而很少有应用程序会知道myapp://hello 以同样的方式有意义。

【讨论】:

  • 我明白了。好建议。我过去在 iOS 上做过这个,因为所有的网络浏览器在某些时候都必须使用 Apple 的 UIWebView,它们可以确保一致的 API,因此自定义 URL 方案也可以正常工作。谢谢!
【解决方案2】:

如果 url 是 http://www.example.com/test/test1 表示使用以下代码:

在android清单文件中添加

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Holo.Light.NoActionBar">
    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter android:label="@string/app_name" >
         <action android:name="android.intent.action.VIEW" />
         <!-- Accepts URIs that begin with "http://example.com/test/test1" -->
         <data
             android:host="www.example.com"
             android:pathPrefix="/test/test1"
             android:scheme="http" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
</activity>

【讨论】:

    【解决方案3】:

    查看我提出的问题here. 您应该查看我授予赏金的答案并查看 cmets。

    总结:
    使用 android web-view 的应用程序存在问题。
    问题不在于您,而在于您单击链接的应用程序。在这种情况下,您的浏览器。

    你可以试试 HTML 查看器,它会工作的,至少它对我有用。
    一些默认的电子邮件应用程序,即 Xperia 确实有效。

    现在在 Google IO 2015 中,随着 Android M 的发布,他们还改进了应用程序深度链接(同样的事情),因为我们(开发人员)对此有很多抱怨。
    你可以看到它herehere

    希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      问题在于没有标准 - 所以每个解决方案都会有其缺陷。

      经过大量研究和工作,我建议在任何地方都使用Android App Links(http/s 链接),并使用自定义应用方案 (myapp://...) 回退到具有深层链接的页面。

      可以使用代理服务器处理回退 - 如果应用链接不起作用,它将打开浏览器以打开具有打开 URL 的网页。

      它已经过测试并证明可以捕捉所有已知的陷阱。

      顺便说一句:当今最流行的浏览器在 Android 上完美地处理自定义应用方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 2016-03-04
        • 2011-01-31
        • 2017-02-05
        相关资源
        最近更新 更多