Javascript Android-深度链接并非在所有情况下和所有浏览器上都有效

Javascript Android-深度链接并非在所有情况下和所有浏览器上都有效,javascript,android,android-intent,deep-linking,Javascript,Android,Android Intent,Deep Linking,我为我的一项活动创建了一个意向过滤器,以便能够通过深度链接启动它: <activity android:name="com.myapp.activities.LoginActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW"

我为我的一项活动创建了一个意向过滤器,以便能够通过深度链接启动它:

     <activity
        android:name="com.myapp.activities.LoginActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="myserver.com"
                android:pathPrefix="/product/"
                android:scheme="https" />
            <data
                android:host="www.myserver.com"
                android:pathPrefix="/product/"
                android:scheme="https" />
        </intent-filter>
    </activity>
基本上一切都正常。当我从任何电子邮件客户端、whatsapp消息或推文中单击这些链接时,在“应用程序选择器”对话框中选择任何浏览器,它会识别我的意图过滤器并打开正确的活动。这意味着我的意图过滤器被定义为ok

但是。。。在某些情况下,我需要从设备的日历或HTMLViewer中单击这些链接。在这些情况下,当我选择股票浏览器时,我的应用程序不会打开。它只是打开带有URL地址的浏览器。当我选择设备的股票浏览器时,就会发生这种情况。当我选择其他浏览器(如Chrome)时,应用程序将正确打开。 知道为什么吗?或者,我如何使深度链接在所有情况下都有效

2重要说明:

我现在正在Galaxy S3上测试这个。我知道Galaxy设备上的浏览器本身并不被视为库存。不过,我还是想找到一个能在所有设备上运行的解决方案

深度链接的url地址是在浏览器端运行javascript的实际地址。如果应用程序未安装在用户的设备上,它会将用户重定向到play store。我这么说是因为如果服务器端解决方案能够解决这个问题,我也愿意接受。我看到了,但答案对我来说并不适用

无论如何,我真的很感谢SO社区的帮助。这对我和其他人来说都是一种痛苦


谢谢。

我看不出你的帖子有什么明显的错误,但你说:

在这些情况下,当我选择股票浏览器时,我的应用程序不会打开

当您单击链接时,您的应用程序是否未显示为可供选择的选项?如果您的筛选器匹配,则应为选项否?如果你选择默认浏览器,我不会责怪它吞咽了你的意图

无论如何,如果您无法让它工作,您可以使用一些客户端web代码,让URL在安装时发送到应用程序,在未安装时发送到商店,并将URI方案修改为您自己的自定义方案。看看这个答案:

然后,您可以同时筛选这两种:

<activity
    android:name="com.myapp.activities.LoginActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="myserver.com"
            android:pathPrefix="/product/"
            android:scheme="https" />
        <data
            android:host="www.myserver.com"
            android:pathPrefix="/product/"
            android:scheme="https" />
        <data
            android:host="product"
            android:scheme="asafk" />
    </intent-filter>
</activity>
请让我知道这是否解决了您的问题。您的用户可能仍然选择了错误的选项,因此我仍然建议遵循我的另一个建议,在页面上添加一些Javascript,尝试打开应用程序。这是非常基本的,但我认为它在这方面得到了广泛的应用


希望这能解决您的问题。

谢谢您的回复。首先,我想澄清一下,即使我的应用程序安装在一个带有映射到url的意向过滤器的设备上,单击此url将始终希望打开浏览器作为第一步。只有在选择浏览器后,它才会显示选择“我的应用”的选项。第一步是有问题的一步。选择股票浏览器并不总是在第二步向您显示我的应用。其次,您建议的解决方案说,如果安装了应用程序,您可以使用一些客户端web代码将URL发送到应用程序,如果没有,则发送到商店。您如何确切地检查应用程序是否已安装?没有办法知道这一点,这就是为什么要在意图过滤器中放置一个实际的url。如果安装了该应用程序,则应启动该应用程序。如果没有,则url会在浏览器中打开,您可以将用户重定向到商店。添加了一个更新,似乎可以解决您的问题。阅读您发布的链接,我实际上已经在添加android:pathPattern=.*之前添加了斜杠,但仍然没有骰子。另外,我已经实现了一个用于重定向用户的javascript。正如我在问题中已经提到的,在我的情况下,它只适用于商店。不建议使用cusom架构重定向用户,因为我们无法确定是否安装了应用程序。如果不是这样的话,我们就会走到死胡同。你是说你在Galaxy S3上测试了这个,它成功了。您是否尝试从S-Planner或HTMLViewer中单击url?因为这就是我看到这个问题发生的地方。
 <activity
    android:name="com.myapp.activities.LoginActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="myserver.com"
            android:pathPrefix="/product"
            android:scheme="https" />
        <data
            android:host="www.myserver.com"
            android:pathPrefix="/product"
            android:scheme="https" />
    </intent-filter>
</activity>