深层链接意图不起作用
我遵循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我删除它,它的工作
- 使用Google Services 3.0.0和build.gradle中的Maps API密钥丢失api_key /当前密钥
- 如何在Django 1.7中解决“django.core.exceptions.ImproperlyConfigured:应用程序标签不唯一,重复:foo”?