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

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

Android-манифест модуля URL:

<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)

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

Другие вопросы по тегам