Я пытаюсь протестировать андроид ссылки с глубоким URL-адресами через adb, чтобы запустить приложение
Когда я набираю команду в adb:
./adb shell am start -W -a android.intent.action.VIEW -d "example:gizmos" com.myapp
Я получаю эту ошибку:
Starting: Intent { act=android.intent.action.VIEW dat=example://gizmos pkg=com.myapp }
Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.myapp }
Но когда я набираю команду в adb:
./adb shell am start -W -a android.intent.action.VIEW -d "example:gizmos" com.myapp.activity.DeepLinkActivity
Все работает нормально, и я получаю сообщение, и я вижу запуск активности на телефоне:
Starting: Intent { act=android.intent.action.VIEW dat=example://gizmos cmp=com.myapp.activity.DeepLinkActivity }
Status: timeout
Activity: com.myapp.activity.DrawerActivity
Complete
Мой вопрос, почему мне нужно получить полный путь к моей деятельности, а не только имя пакета? Потому что, когда внешние приложения или браузер попытаются использовать глубокую ссылку, они не будут вызывать активность в моем приложении.
Это мой AndroidManifest.xml
<activity
android:name=".activity.DeepLinkActivity">
<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="example"
android:host="gizmos" />
</intent-filter>
</activity>
Ответы
Ответ 1
Вам не нужно указывать полный путь к вашей активности, но если вы хотите проверить, правильно ли вы реагируете на URI в, просто укажите пакет приложения:
adb shell am start -a android.intent.action.VIEW -d "example://gizmos" com.myapp
Также есть ошибка в команде, которую вы указали - там должно быть example://gizmos
not example:gizmos
Ответ 2
Лучшее решение для Android Studio объясняется здесь: https://code.tutsplus.com/tutorials/how-to-enable-deep-links-on-android--cms-26317
TL;DR: Android Studio → Выполнить → Изменить настройки
Измените Launch в Launch Options на "URL" и введите в текстовое поле URL правильный URL: "что-то://"
Ответ 3
Как уже упоминалось в другом ответе, это должен быть "example://gizmos", а не "example: gizmos"
В качестве альтернативы, вместо использования adb, вы можете проверить глубокие ссылки непосредственно на Android с помощью приложения Deep Link Tester:
https://play.google.com/store/apps/details?id=com.manoj.dlt
Не нужно указывать имя пакета или имя компонента. Просто введите глубокую ссылку и огонь.
Я обнаружил, что тестирование глубоких ссылок через adb иногда было сложным и сложным. Следовательно, я создал это небольшое приложение, чтобы сделать это.
Ответ 4
Ваша команда неверна, потому что вы пытаетесь с неправильным именем пакета. Вместо com.myapp.activity.DeepLinkActivity
вам нужно написать только имя пакета, указанное в build gradle (Module: app), по идентификатору приложения, например, если ваш applicationId com.companyname
, тогда ваша команда будет выглядеть так:
adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos" com.companyname
Ответ 5
На тот случай, если у кого-то еще возникла проблема, а именно, что adb shell am start...
не работает, если у вас есть фильтр file:///...
или content://...
в вашем фильтре намерений например, указан тип mime
<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="content" />
<data android:scheme="file" />
<data android:mimeType="text/plain" />
<data android:host="*" />
</intent-filter>
Вам необходимо указать тип mime в командной строке с помощью параметра -t:
adb shell am start -W -a android.intent.action.VIEW -d "file:///sdcard/myfolder/myfile.txt" -t "text/plain" com.myapp
или вы получите то же сообщение об ошибке, что и OP.
Исходя из только что полученного опыта, я рекомендую использовать этот список доступных команд adb. Похоже, что оно более свежее, чем тексты справки из оболочки моего тестового устройства под управлением Android 8.