Android深度链接不遵循path前缀

我能find的最近的就是这个问题。 但它并不完全覆盖我所拥有的问题。

我在我的应用程序设置中使用/ app作为path前缀的深层链接。 我遇到的问题是像http://example.com/upgrade这样的链接也试图打开我的应用程序,即使它没有/应用程序中的任何地方的url。 我知道你不能排除由前缀指定的url,但不是path前缀的整个点,只包括那些url?

基本上我想要这样的链接深入链接:

 http://example.com/app/home http://example.com/app/specials 

但不是像这样的链接:

 http://exaple.com/ http://example.com/login 

这是我在我的清单中所具有的:

 <data android:scheme="http" android:host="example.com" android:pathPrefix="/app"/> 

编辑1

也发现这个链接,但我没有任何空的前缀,只有一个斜线“/”

编辑2

触发它的url是http://example.com/upgrade.php?app=1&method=1&uid=1 ,我不确定后面的应用程序是什么? 也会触发它,所以我改变了前缀/应用程序,但也没有工作,它仍然触发它们。

编辑3

这里是清单中的其他深层链接数据标签:

简介活动

 <data android:scheme="myapp" android:host="profile" android:pathPrefix="/"/> 

login/注册活动

 <data android:scheme="myapp" android:host="login" android:pathPrefix="/signup"/> 

主要活动

 <data android:scheme="myapp" android:host="main" android:pathPrefix="/"/> <data android:scheme="http" android:host="test.example.com" android:pathPrefix="/app"/> <data android:scheme="http" android:host="live.example.com" android:pathPrefix="/app"/> 

编辑4

这是变得越来越混乱,如果我删除数据标签与myapp作为scheme从活动(或者如果我从一切的前缀“/”删除pathPrefix)它不再触发深度链接从url,即使他们有/ app。

Solutions Collecting From Web of "Android深度链接不遵循path前缀"

我弄明白了,看起来好像数据标签是相互渗透的,所以scheme“example”的数据前缀“/”也适用于其他数据标签中的所有scheme。 我只是不得不为我的自定义scheme深层链接和url深层链接使用单独的Intentfilter,如下所示:

 <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- must start with http://test.example.com/app --> <!-- http://test.example.com/ won't work since prefix / is in a different intent-filter --> <data android:scheme="http" android:host="test.example.com" android:pathPrefix="/app"/> <!-- must start with http://test.example.com/app --> <data android:scheme="http" android:host="live.example.com" android:pathPrefix="/app"/> </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" /> <!-- must start with example://main/ --> <!-- http://test.example.com/ won't work since http is in a different intent-filter --> <data android:scheme="example" android:host="main" android:pathPrefix="/"/> </intent-filter> </activity> 

自己运行一些testing我认为你自己创build了这个问题,然后继续testing从你的应用程序的更深的链接去

设置 – >您的应用程序名称 – >默认启动并select清除默认值

然后导航回到您的应用清单,并将意图filter添加到您的活动为每个url:

在你的例子中,你要求

 http://example.com/app/home http://example.com/app/specials 

我将假设你有一个活动,将启动上面给出的URI中的每一个。

为清单中的HomeActivity做:

 <activity android:name=".HomeActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- http://example.com/app/home --> <data android:scheme="http" android:host="example.com" android:pathPrefix="/app/home"/> <!-- https://example.com/app/home --> <data android:scheme="https" android:host="example.com" android:pathPrefix="/app/home"/> <!-- custom url scheme example://app/home --> <data android:scheme="example" android:host="app" android:pathPrefix="/home"/> </intent-filter> </activity> 

adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/hometestingadb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/homeadb shell am start -W -a android.intent.action.VIEW -d example.com/app/home从你的terminal

然后为您的特别活动

 <activity android:name=".SpecialsActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- http://example.com/app/specials --> <data android:scheme="http" android:host="example.com" android:pathPrefix="/app/specials"/> <!-- https://example.com/app/specials --> <data android:scheme="https" android:host="example.com" android:pathPrefix="/app/specials"/> <!-- custom url scheme example://app/specials --> <data android:scheme="example" android:host="app" android:pathPrefix="/specials"/> </intent-filter> </activity> 

adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specialstestingadb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specialsadb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials从您的terminal

这几乎是如何工作,如果你设置你的应用程序来处理一个http://example.com/url,并select默认情况下,那么,它将尝试打开http://example.com/{anything}使用你的应用程序

所以简而言之,当你指定你的pathPrefix时,确保你包含了你真正想拦截的内容,如果你testing一个不应该打开你的应用程序的链接,就不要select你的应用程序,只需调整你的pathPrefix,不要被你的应用程序触发。

例如上面的URL 不会打开

 http://example.com/app 

因为我们还没有定义一个<data />标签来处理这个。

更新并使用\或*直接从文档添加:

因为当从XML中读取string(在将其parsing为模式之前)时, '\'被用作转义字符,所以您将需要双重转义:例如,文字'*'将被写为'\\*'和文字'\'将被写为'\\\\' 。 这与在Java代码中构造string时需要编写的基本相同。

祝你好运,快乐的编码!