我能找到的最接近的是这个问题here。但它并没有完全覆盖我的问题。
我的应用设置中有深层链接,使用/ app作为路径前缀。我遇到的问题是像http://example.com/upgrade
这样的链接也试图在我的应用中打开,即使它在网址中的任何地方都没有/ app。我知道你不能排除前缀指定的网址,但不是路径前缀的整个点只包括那些网址吗?
基本上我希望像这样的链接深层链接:
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
也找到了this link,但我没有任何空的前缀,只有一个只有斜杠&#34; /&#34;
修改2
触发它的网址是http://example.com/upgrade.php?app=1&method=1&uid=1
,我不确定应用之后的应用是什么?也会触发它所以我将前缀更改为/ application但是它也没有工作,它仍然会触发它们。
编辑3
清单中的其他深层链接数据标记:
个人资料活动
<data android:scheme="myapp"
android:host="profile"
android:pathPrefix="/"/>
登录/注册活动
<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作为方案的数据标记(或者如果我从前缀为&#34; /&#34;的所有内容中删除pathPrefix),这会变得越来越混乱。更长的时间会触发来自网址的深层链接,即使它们中包含/ app。
答案 0 :(得分:10)
我想通了,似乎数据标签彼此流血,所以&#34; /&#34;的前缀有关方案的数据&#34;示例&#34;也适用于其他数据标签中的所有方案。我只需要为我的自定义方案深层链接和url深层链接使用单独的Intent过滤器,如下所示:
<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>
答案 1 :(得分:2)
正如here所述,您的属性会合并:
虽然可以在同一个过滤器中包含多个
<data>
元素,但是当您打算声明唯一的网址(例如特定组合)时,创建单独的过滤器非常重要方案和主机),因为同一个意图过滤器中的多个<data>
元素实际上合并在一起,以说明其组合属性的所有变体。
将它们放入<intent-filter>
的单独实例中可以解决您的问题。
答案 2 :(得分:1)
我自己运行一些测试我认为你自己已经创建了这个问题,然后再继续测试应用程序中的任何更深层链接
设置 - &gt;您的应用名称 - &gt;默认启动并选择清除默认值
然后导航回您的应用清单,并为每个网址的“活动”添加意图过滤器:
在你的例子中,你要求
http://example.com/app/home
http://example.com/app/specials
我将假设您有一个Activity,它将针对上面给出的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/home
和adb shell am start -W -a android.intent.action.VIEW -d example.com/app/home
从您的终端进行测试
然后是您的SpecialsActivity
<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/specials
和adb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials
从您的终端进行测试
这几乎是它的工作原理,如果您将应用设置为处理http://example.com/
网址并默认选择选择,那么它将尝试使用您的应用打开http://example.com/{anything}
所以简而言之,当你指定你的pathPrefix时,请确保你包含你真正想拦截的内容,如果你测试的链接不应该打开你的应用,请不要选择你的应用,调整您的pathPrefix,以便它不会被您的应用触发。
例如,赢得打开
以上的网址http://example.com/app
因为我们尚未定义<data />
标记来处理此问题。
<强>更新强> 并且在使用\或*:
时直接从文档中添加因为从XML读取字符串(在将其解析为模式之前)时
'\'
用作转义字符,所以您需要双重转义:例如,文字'*'
将写为'\\*'
,文字'\'
将写为'\\\\'
。这与在Java代码中构造字符串时需要编写的内容基本相同。
祝你好运,编码愉快!