深层链接意图不起作用

我遵循https://developer.android.com/training/app-indexing/deep-linking.html上的规则 ,但是当我想通过adb触发intent时:

 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> 

我有没有犯过明显的错误?

编辑:

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

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

然后接受多个数据标签,你需要不同的意图filter( 就像我在网上看到的所有其他例子一样,这对我来说是工作的方式 )。 例如:

 <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> 

注意第一个filter在Google Chrome上工作,而第二个filter在ADB上工作。

注2 :如果链接被input到浏览器的地址栏中,应用select菜单将不会显示。 它必须是<a href="http://example.com"></a>链接的一些页面。

在我看来,这里的一切都是模糊的,真的不是我期望的一切工作。 但是,这是如何在我的设备上工作。 希望这对你也有帮助(和工作)。

经过一些testing,这是对我有用:

  <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”一样。

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

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

希望这有助于你开始。

当一切正常工作,你可能会想为不同的活动configuration一个不同的pathPrefix

首先,阅读@ 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> 

“。*”匹配空string和“/”,因此两种情况都被覆盖。 如果你最终试图处理多个计划和主机,这变得尤为重要,所以你不必发送{http,https} X {“”,“/”} X {“foo”,“bar”等}

在我的情况下,我正在MainActivity,这也是主要的启动器深层链接意图filter。 这导致了这个问题。

在我创build另一个单独的活动并将意图filter放在那里之后,它解决了这个问题。 希望这可以帮助那些面临同样问题的人。

确保你的url是这种格式(用你自己的帽子字母代替):

android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams

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> 

改用这个意图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 "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> 

感谢司马的回应,我想补充一些说明:

  • 使用以下命令testing您的活动后:

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

  • 在将意图filter添加到AndroidManifest.xml文件(下面的行)后,您将需要testing您的深层链接:

    ……

所以这是您可以testing的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我开始-W -a android.intent.action.VIEW -d“ http://example.com/gizmos ”com.myapp.android

它会工作。

在我的情况下,我有一个端口8075的URL我删除它,它的工作