Ссылка приложения Android на динамическую функцию показывает диалоговое окно выбора приложения, в котором дважды отображается одно и то же приложение

Я пытаюсь открыть действие с помощью ссылок на приложения Android. Действия находятся в модуле динамических функций в Образце проекта Google.

Я не загрузил проект в 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 показывает диалоговое окно выбора приложения, в котором дважды отображается одно и то же приложение:

результат

Вы знаете, почему это происходит? Это запланированное поведение?

>

<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, и все было в порядке.


person Mustafa Berkay Mutlu    schedule 05.02.2019    source источник
comment
Я думаю, вам не нужно setPackage() и addCategory() для намерения. попробуй это!   -  person SamiAzar    schedule 05.02.2019
comment
Любое решение этой проблемы?   -  person Nagendra Hari Karthick    schedule 05.08.2019
comment
к сожалению нет   -  person Mustafa Berkay Mutlu    schedule 06.08.2019


Ответы (2)


Похоже, это ошибка динамической функции при использовании намерения URI, о которой сообщалось здесь. образец репозитория Google об ошибке сообщается здесь Единственное возможное решение I На данный момент мы можем дать следующее: «На данный момент мы можем использовать отражение, чтобы заставить эту работу».

  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. Однако это не официальный рекомендуемый метод. Для получения дополнительной информации проверьте это.

person Nagendra Hari Karthick    schedule 04.09.2019

Существует возможное решение для использования намерений URI с динамическими функциями. Вы можете использовать уловку, при которой вы можете получить необходимое имя класса во время выполнения с помощью packageManager.queryIntentActivities(), поэтому вам не нужно использовать жестко запрограммированное имя Activity.

Следующая функция расширения является примером того, как вы можете преобразовать свое намерение с помощью 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)

Более подробное объяснение можно найти здесь

person Siebe Datema    schedule 03.01.2021