具有动态功能的即时应用程序始终显示带有1个选项的消歧对话框

Ent*_*eco 5 android android-manifest android-instant-apps android-app-bundle android-app-links

我正在尝试动态功能和Instant Apps。为了在各种功能之间导航,我使用了深层链接。

每次导航到另一个“活动”时,都会看到消歧对话框少于1秒,其中列出了1个应用程序。请注意,“ Once”和“ Always”(在荷兰语中)的选项是如何变灰的。

示例Github项目

我创建了一个简约的示例,该示例与我在Github上的当前结构相匹配。需要Android Studio 3.5-RC2

消歧对话框简短显示

一些上下文:

我非常有信心,深层链接配置正确。但是由于你们还是想检查一下,因此配置如下:

1-清单:

<activity
            android:name=".ProfileActivity">

        <intent-filter
                android:autoVerify="true"
                android:priority="100">

            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data
                    android:host="giddy.entreco.nl"
                    android:pathPrefix="/profile"
                    android:scheme="http" />
            <data android:scheme="https" />

        </intent-filter>

    </activity>
Run Code Online (Sandbox Code Playgroud)

2-Assetlinks 我的域包含一个可公开访问的assetlinks.json

3-Sha's正确 我使用的sha's正确

Executing tasks: [signingReport] in project

SHA1: 3A:52:19:77:C1:AD:18:F4:98:21:77:74:37:DC:9B:89:02:64:6E:C6
SHA-256: 25:DD:C3:7B:8E:35:D3:39:D5:D4:6C:B5:EA:7D:14:AF:82:EC:9C:56:A6:F5:76:A3:E1:D7:69:B3:EC:58:72:E8
Valid until: Saturday, March 21, 2048
Run Code Online (Sandbox Code Playgroud)

4-确认的数字资产链接文件 所有检查均通过 https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://giddy.entreco.nl&relation=delegate_permission/common.handle_all_urls

5-测试URL意图 也可以!唯一的问题是我在短时间内看到了消歧对话框。

附加信息

  • apply plugin: 'com.android.dynamic-feature'在所有模块中使用(app当然课程除外)

  • Android Studio:3.5 RC2;Android-gradle-plugin:3.5.0-rc02

  • 我的设备是OnePlus6-配备氧气9.0.7和Android 9

  • 谷歌官方样片也表明我的设备上这种行为

  • 某些三星设备的行为有所不同。它没有显示“使用1消除歧义”选项,而是列出了我的应用两次,并将一直等待直到您选择Once“始终”。(请注意,我是从Play商店的发布前报告中获得的) 在此处输入图片说明

  • 无论我构建APK,应用程序捆绑包还是通过Google Play下载,我都能看到这种行为。总是一样的。

有什么建议可以消除烦人的对话吗?当我分析apk /捆绑包时,确实看到了两个特定的条目Activity。一旦进入base module's manifest,也就进入了profile module's manifest。我对Android / PlayStore在安装模块时如何合并这些清单几乎一无所知,但我想在这种情况下查看对话框可能很有意义。

小智 1

有一个可能的解决方案,可以使用具有动态功能的 URI 意图,而不是切换到反射。您可以使用一个技巧,可以在运行时使用 packageManager.queryIntentActivities() 获取所需的类名称,这样您就不必使用硬编码的 Activity 名称。

以下扩展函数是一个示例,说明如何使用 URI 或深层链接将 Intent 转换为不显示选择器对话框的 Intent:

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)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地执行以下操作:

intent.convertToSafeDynamicFeatureModuleIntent(context)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

可以在这里找到更长的解释