Android Deep Linking с пользовательским URI
В моем манифесте определено следующее:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.package">
...
<activity
android:name="app.myActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<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:host="www.example.com"
android:pathPrefix="/gizmos"
android:scheme="http" />
<!-- note that the leading "/" is required for pathPrefix-->
<!-- Accepts URIs that begin with "example://gizmos”-->
<data
android:host="gizmos"
android:scheme="example" />
</intent-filter>
</activity>
...
И я определил мой onCreate () как таковой:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Uri data = intent.getData();
if (data != null) {
Log.d("URI",data.toString());
}
}
Это в соответствии с документацией Android: Android Deep Linking
Итак, вопрос таков:
Как проверить глубокую привязку URI? Согласно документации я запускаю что-то вроде
Adb shell am start -Ч-андроид.намерение.действие.ВИД - д "пример: / / вещицы" ком.апп.пакет
Но это производит:
Ошибка: активность не запущена, не удается разрешить намерение { act=android.намерение.действие.Посмотреть dat=пример: / / gizmos flg=0x10000000 pkg=com.апп.пакет }
Я также попробовал оболочку с именем и ссылкой на активность, активность запуска и оставил пакет пустым. Единственный, кого я могу заставить работать, это:
Adb shell am start-W-A android.намерение.действие.Вид-d "http://www.example.com/gizmos "
Но даже если я это сделаю, это не значит, что это будет работать в других приложениях. Пользовательские URI (например, пример: / / gizmos) недоступны для других приложений, таких как Gmail и WhatsApp, поэтому тестирование в экосистеме Android также проблематично.
Ответ на этот вопрос переполнения стека не приемлем, так как он не отвечает на вопрос, а скорее просто поощряет использование http: / / version, I want the пример: / / схема работы.
2 ответа:
ADB отправляет намерение, просто ваше приложение должно иметь отдельные фильтры намерения, когда вы хотите несколько типов ссылок:
<activity android:name="app.myActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <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" /> <data android:host="www.example.com" android:pathPrefix="/gizmos" android:scheme="http" /> <!-- note that the leading "/" is required for pathPrefix--> </intent-filter> </activity>
Тогда работают следующие команды ADB:
Adb shell am start-W-A android.намерение.действие.VIEW-d "пример: / / вещицы"
adb shell am start-W-A android.намерение.действие.Вид-d "http://www.example.com/gizmos "Однако я столкнулся с проблемами при добавлении большего количества элементов в пользовательский URI (например, пример: / / вещицы?data1= 'hello'&data2= 'world' - ' & ' отсекается)
И, очевидно, это не исправляет тот факт, что эти ссылки не являются кликабельными в других приложениях, таких как WhatsApp и Gmail... и все же они кликабельны на других платформах.
Как упоминалось в другом ответе, платформа android требует, чтобы вы объявляли отдельные фильтры намерений для каждой глубокой ссылки, которую вы включаете в своем приложении. Вот почему вы получаете ошибку.
Кроме того, вместо использования adb, вы можете проверить deep links непосредственно на android с помощью приложения deep link tester:
Https://play.google.com/store/apps/details?id=com.manoj.dlt
Нет необходимости упоминать имя пакета или имя компонента. Просто введите фактическим прямым ссылкам и огонь.
Я работал с глубокими ссылками и лично обнаружил, что тестирование через adb отнимает много времени. Поэтому я создал это приложение для тестирования глубоких ссылок напрямую и разместил его в play store.