Android-приложение Ссылка на динамическую функцию Показывает диалог выбора приложения, показывая одно и то же приложение дважды
Я пытаюсь открыть активность, используя ссылки на приложения для Android. Активность находится в модуле динамических функций в проекте Google Sample.
Я не загрузил проект в Google Play, поэтому я тестирую с использованием отладочного типа сборки, с конфигурацией запуска, которая включает все динамические функции в APK.
Код, который я хочу проверить:
private fun openUrl(url: String) { // url will be "http://uabsample-405d6.firebaseapp.com/url"
var intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
intent.setPackage(packageName)
intent.addCategory(Intent.CATEGORY_BROWSABLE)
startActivity(intent)
}
Но когда я пытаюсь перейти к функции URL, Android показывает диалоговое окно выбора приложения, в котором дважды отображается одно и то же приложение:
Вы знаете, почему это происходит? Это намеренное поведение?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="com.android.samples.instantdynamicfeatures">
<dist:module
dist:instant="true"
dist:onDemand="false"
dist:title="@string/title_url_instant_module">
<dist:fusing dist:include="true" />
</dist:module>
<application>
<activity
android:name="com.android.samples.instantdynamicfeatures.UrlInstantModuleActivity"
android:label="@string/title_activity_url_instant_module"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter
android:autoVerify="true"
android:order="1">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="uabsample-405d6.firebaseapp.com"
android:path="/url"
android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
</activity>
</application>
</manifest>
<resources>
...
<string name="title_url_instant_module">url</string>
<string name="title_activity_url_instant_module">url_instant_module_activity</string>
</resources>
Обновление: я забыл упомянуть: я изменил идентификатор приложения примера проекта и разместил известный Json на своем веб-сайте. Я проверил с помощью App Links Assistant, и это было хорошо.
2 ответа
Похоже, это ошибка в динамической функции при использовании намерения URI, о которой здесь сообщалось. Для репозитория образца Google ошибка сообщается здесь. Единственное возможное решение, которое я могу дать на данный момент, это: на данный момент мы можем использовать отражение, чтобы сделать эта работа.
private fun openUrl(url: String) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
intent.setPackage(BuildConfig.APPLICATION_ID)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.setClassName(getPackageName(),"com.android.samples.instantdynamicfeatures.UrlInstantModuleActivity")
intent.addCategory(Intent.CATEGORY_BROWSABLE)
startActivity(intent)
}
Используйте имя пакета приложения и имя класса активности в функции setClassName. Однако это не официальный рекомендуемый метод. Для получения дополнительной информации проверьте его.
Существует возможное решение для использования намерений URI с динамическими функциями. Вы можете использовать трюк, где вы можете получить необходимое имя класса во время выполнения с помощью
packageManager.queryIntentActivities()
, поэтому вам не нужно использовать жестко заданное имя Activity.
Следующая функция расширения является примером того, как вы можете преобразовать свой Intent, используя URI или глубокую ссылку, в тот, который не будет отображать диалоговое окно выбора:
fun Intent.convertToSafeDynamicFeatureModuleIntent(context: Context) {
//Get list of all intent handlers for this Intent. This should only be the actual activity we are looking for
val options = context.packageManager.queryIntentActivities(this, PackageManager.MATCH_DEFAULT_ONLY)
//Set the activity that supported the given intent
setClassName(packageName, options[0].activityInfo.name)
}
Тогда вы можете просто сделать:
intent.convertToSafeDynamicFeatureModuleIntent(context)
startActivity(intent)
Более подробное объяснение можно найти здесь