深度链接意图不起作用

我遵循 https://developer.android.com/training/app-indexing/deep-linking.html上的指令,但是当我想通过 adb触发意图时,用:

adb shell am start
-W -a android.intent.action.BROWSEABLE
-d "http://example.com/gizmos" com.myapp.android

我只是

错误: 活动未启动,无法解析意图{ Act = android.intent.action.VIEW dat = example://gizmos flg = 0x1000000 Pkg = com.myapp.android }

<activity
android:name=".activities.DeepLinkActivity"
android:label="@string/title_activity_deep_link">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />


<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:scheme="http"
android:host="example.com"
android:pathPrefix="/gizmos" />
</intent-filter>
</activity>

我犯了什么明显的错误吗?

85099 次浏览

编辑:

好的,首先确保你的软件包可以通过 adb 访问:

adb shell am start -n com.example.simon.test/.activities.MainActivity

然后,为了接受多个数据标签,你需要不同的意图过滤器(这就是它对我起作用的方式,不像我在网上看到的所有其他例子)。例如:

<intent-filter>
...
<data android:scheme="http"
android:host="example.com"/>
</intent-filter>
<intent-filter>
...
<data android:scheme="http"
android:host="example.com"
android:pathPrefix="/gizmos"/>
</intent-filter>

注意: 在上面的例子中,pathPrefix 以 斜杠开头!

我不知道为什么谷歌的文档会如此具有误导性,或者可能是为了某个不同版本的 adb,但是上面的改变对我来说非常有效。这有助于: 来源


这就是我如何制作 Chrome 浏览器路由链接到我的应用程序:

<activity
android:name=".activities.DeepLinkActivity"
android:label="@string/app_name">
<!-- Accept chrome links -->
<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:scheme="http"
android:host="example.com"
android:pathPrefix="/"/>
</intent-filter>
<!-- Accept adb data flag -->
<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:scheme="http"
android:host="example.com"/>
</intent-filter>
</activity>

第一个过滤器可以在 Google Chrome 上使用,而第二个过滤器可以在 ADB 上使用。

注意2 如果链接进入浏览器的地址栏,应用程序选择菜单将不会显示。它 已经是一个 <a href="http://example.com"></a>链接在一些网页内。

在我看来,这里的一切都相当模糊,真的不是我所期望的工作方式。但我的设备就是这么工作的。希望这对你也有帮助。

经过一些测试之后,下面的方法对我有效:

    <activity android:name=".activities.MainActivity">
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"
android:host="www.example.com"
android:pathPrefix=""
/>
<data android:scheme="myschema"
android:host="example"
android:pathPrefix=""
/>
</intent-filter>
</activity>

当点击浏览器中的任何链接(如“ http://www.example.com”、“ http://www.example.com/”或“ http://www.example.com/whatever”)时,这种方法都会起作用。“ myschema://example/whatever”也是一样。

也可以使用这个命令使用 adb(使用任何这些 URL) :

adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com" com.example

希望这能帮助你开始。

当一切正常工作时,您可能需要为不同的活动配置不同的 pathPrefix

首先,在这个页面上阅读@user3249477的答案。

我只是想补充一点,不要写他写的东西,你可以用路径模式来浓缩它:

<activity
android:name=".activities.DeepLinkActivity"
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:scheme="http"
android:host="example.com"
android:pathPattern=".*"/>
</intent-filter>
</activity>

「。*”匹配空字符串和“/”,因此这两种情况都包括在内。如果您最终尝试处理多个方案和主机的这变得特别重要,所以您不必垃圾邮件的电源组{ http,https } X {“”,“/”} X {“ foo”,“ bar”,等等。}

确保你的 URL 是这种格式(大写字母替换为你自己的) :

Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST? somgetparams

Adb 工具不需要这种格式。使用上面的代码,你可以把它放在 src 或 href 中,就像这样:

<iframe src="android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams"> </iframe>
<a href="android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams">LINK</a>

使用这个意图过滤器,

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />


<!-- Accepts URIs that begin with "example://gizmos” -->
<data
android:host="gizmos"
android:scheme="example" />
</intent-filter>


<intent-filter>
<action android:name="android.intent.action.VIEW" />


<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />


<!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
<data
android:host="www.example.com"
android:pathPrefix="gizmos"
android:scheme="http" />
</intent-filter>

在我的例子中,我将深度链接意图过滤器放在 MainActivity 中,它也是主要的启动程序。导致了这个问题。

在我创建了另一个单独的活动并将意图过滤器放在那里之后,问题就解决了。希望这能帮助其他面临同样问题的人。

感谢西马斯的回应,我想补充一些澄清:

  • 在使用以下命令测试您的活动之后:

    Adb shell am start-n com.example.simon.test/. activity. MainActivity

  • 在将意图过滤器添加到 AndroidManifest.xml 文件之后,您将需要测试您的 deeplink (下面几行) :

    ... ...

所以这是 adb 命令,您可以用它来测试:

adb shell am start -W -a android.intent.action.VIEW -d "http://example.com/gizmos" com.example.packageid

还有

adb shell am start -W -a android.intent.action.VIEW -d "http://example.com" com.example.pakageid

使用 adb shell am start - 一个机器人,意图,行动,视图 - d“ http://example.com/gizmos”com.myapp.android

会成功的。

在我的情况下,我有一个端口8075的网址,我删除了它和它的工作

./adb shell am start-n packagename/. splashActivity-d“ schemeName://content”

如果您没有权限问题,它可能与 API 级别有关

在我的例子中,我使用的是一个模拟器,而不是一个实际的 usb 连接设备,因此我必须将-d 改为-e,如下所示:

adb shell am start -W -a android.intent.action.VIEW -e "http://www.example.com" com.example

注意深度链接之前的 E