Умывка с глубокой связью не работает
Я следил за инструкциями 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>
Я сделал какие-либо очевидные ошибки?
Ответы
Ответ 1
EDIT:
Хорошо сначала убедитесь, что ваш пакет доступен через adb:
adb shell am start -n com.example.simon.test/.activities.MainActivity
Затем, чтобы принять несколько тегов данных, вам нужны разные фильтры намерений (что способ работал у меня, в отличие от всех других примеров, которые я видел в сети). Например:.
<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, но приведенные выше изменения отлично работали для меня. Это помогло: Источник
Вот как я сделал браузер браузера 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.
ПРИМЕЧАНИЕ2 Меню выбора приложения не будет отображаться, если ссылка введена в адресную строку браузера. Он имеет как ссылку <a href="http://example.com"></a>
в стороне на некоторой странице.
На мой взгляд, все здесь довольно размыто и действительно не так, как я ожидал, что все это сработает. Но как это работает на моем устройстве. Надеюсь, что это поможет (и работает) для вас тоже.
Ответ 2
После некоторых тестов это то, что сработало для меня:
<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".
Также работает с adb
с помощью этой команды (с любым из этих URL-адресов):
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com" com.example
Надеюсь, это поможет вам начать работу.
Когда все работает, вы, вероятно, захотите настроить другой pathPrefix
для разных действий.
Ответ 3
Сначала прочитайте @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>
". *" соответствует как пустой строке, так и "/", поэтому оба случая покрываются. Если вы в конечном итоге пытаетесь обрабатывать несколько схем и узлов, это становится особенно важным, поэтому вам не нужно спамить набор параметров {http, https} X {"", "/" } X {"foo "," bar", и т.д.}
Ответ 4
В моем случае я помещал фильтр основной привязки в MainActivity, который также является основным средством запуска. Это вызвало проблему.
После того, как я создал другое отдельное действие и разместил фильтр намерений, он решил проблему. Надеюсь, это поможет другим, которые сталкиваются с одной и той же проблемой.
Ответ 5
Убедитесь, что ваш 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>
Ответ 6
Вместо этого используйте этот фильтр,
<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>
Ответ 7
Спасибо 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
Ответ 8
Использовать оболочку adb am start -W -a android.intent.action.VIEW -d " http://example.com/gizmos" com.myapp.android
он будет работать.
Ответ 9
В моем случае у меня есть порт 8075 в URL, который я удалил, и он работал