我按照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
我得到了
Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 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>
我有任何明显的错误吗?
答案 0 :(得分:101)
修改强>
好的,首先确保您的包可以通过adb访问:
adb shell am start -n com.example.simon.test/.activities.MainActivity
然后要接受多个数据标记,您需要使用不同的意图过滤器(它对我的工作方式不同于我在网上看到的所有其他示例)。 E.g:
<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以正斜杠开头!
我不确定为什么Google的文档会如此误导或者可能是因为某些不同版本的adb,但上述更改对我来说非常有效。这有助于:Source
这就是我将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。
NOTE2 如果链接已输入浏览器的地址栏,则无法显示应用选择菜单。 是某个页面的<a href="http://example.com"></a>
链接。
在我看来,这里的一切都相当模糊,而且我的预期并非如此。但这就是它在我的设备上的工作原理。希望这对你有帮助(并且也有效)。
答案 1 :(得分:12)
经过一些测试后,这对我有用:
<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>
点击浏览器中的任何链接,例如&#34; http://www.example.com&#34;,&#34; http://www.example.com/&#34;或&#34; http://www.example.com/whatever&#34;。与&#34; myschema:// example / whatever&#34;相同。
还可以使用此命令(使用任何这些URL)与adb
一起使用:
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com" com.example
希望帮助你入门。
当一切正常时,您可能希望为不同的活动配置不同的pathPrefix
。
答案 2 :(得分:4)
就我而言,我使用的是仿真器,而不是实际的USB连接设备,因此,我必须将-d更改为-e,如下所示:
adb shell am start -W -a android.intent.action.VIEW -e "http://www.example.com" com.example
在深层链接之前注意 -e 。
答案 3 :(得分:2)
首先,在此页面上阅读@ user3249477的答案。
我只想添加而不是他写的内容,你可以使用pathPattern来压缩它:
<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>
&#34;。*&#34;匹配空字符串和&#34; /&#34;,因此两种情况都被覆盖。如果您最终尝试处理多个方案和主机,这一点变得尤为重要,因此您不必向{http,https} X {&#34;&#发送电子邮件34;,&#34; /&#34;} X {&#34; foo&#34;,&#34; bar&#34;等等}
答案 4 :(得分:2)
就我而言,我在MainActivity中加入了深层链接意图过滤器,MainActivity也是主要的启动器。这导致了这个问题。
在我创建另一个单独的活动并将intent过滤器放在那里之后,它解决了这个问题。希望这可以帮助那些面临同样问题的人。
答案 5 :(得分:1)
确保您的网址采用此格式(上限字母替换为您自己的):
android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams
adb工具不需要此格式。有了上述内容,您现在可以将它放在src或href中,如下所示:
[NSNull null]
答案 6 :(得分:1)
使用adb shell am start -W -a android.intent.action.VIEW -d“http://example.com/gizmos”com.myapp.android
它会起作用。
答案 7 :(得分:1)
在我的情况下,我在网址中有一个端口8075,我将其删除并且有效
答案 8 :(得分:1)
./ adb shell am start -n packagename / .splash.SplashActivity -d&#34; schemeName:// content&#34;
答案 9 :(得分:0)
感谢Simas的回复,我想补充一些说明:
:
adb shell am start -n com.example.simon.test / .activities.MainActivity
在将意图过滤器添加到AndroidManifest.xml文件后,您将需要测试深层链接(如下所示):
... ...
所以这是你可以测试的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
答案 10 :(得分:0)
如果您没有权限问题,则可能与API级别相关
答案 11 :(得分:-1)
请改用此意图过滤器,
<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>