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

时间:2019-08-03 17:02:16

标签: android android-manifest android-instant-apps android-app-bundle android-app-links

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

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

示例Github项目

我创建了一个minimalistic sample,它与我在Github上的当前结构相匹配。需要Android Studio 3.5-RC2

Disambiguation dialog shown briefly

某些上下文:

我非常有信心,深层链接配置正确。但是既然你们还是想检查一下,这里是配置:

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>

2-资产链接 我的域包含可公开访问的assetlinks.json

3-莎的正确 我用的sha是正确的

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

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

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

其他信息

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

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

  • 我的设备是OnePlus6-具有Oxygen 9.0.7和Android 9

  • google official sample也显示this behaviour on my device

  • 某些Samsung设备的行为不同。它没有显示“使用1消除歧义”选项,而是列出了我的应用两次,并将一直等待直到您选择Once或“始终”。 (请注意,我是从Play商店的发布前报告中获得的) enter image description here

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

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

2 个答案:

答案 0 :(得分:4)

是的...我相信我以前已经看过这种情况,当通过URL目的从一个动态功能(即时)导航到另一个动态(非即时)功能时,这是一种奇怪的行为。

在解决此问题之前,我不建议您使用URL意图在模块之​​间导航,相反,请使用反射直接进入其他模块的活动,例如:

if (doesModuleExist()) {
    val intent = Intent()
        .setClassName(getPackageName(), "com.sample.ProfileActivity")
        .addCategory(Intent.CATEGORY_DEFAULT)
        .addCategory(Intent.CATEGORY_BROWSABLE)
    startActivity(intent)
}

doesModuleExist()在以下位置检查是否存在:

  1. 检查您的清单清单,看来您的个人资料模块不是即时应用程序dist:instant="false"的一部分,因此您将永远无法访问它,因此您只需执行isNotInstantApp()请改为检查,并且永远不要尝试将其作为即时应用程序启动。

  2. 一次在您已安装的应用中,那么从技术上讲您无需检查,因为它始终为include="true"

  3. ,但是如果您的配置文件模块是onDemand模块,或者只是出于安全预防措施,则应使用splitInstallManager.getInstalledModules(),请参见/app-bundle/playcore#manage_installed_modules (注意,您也可以在您的即时应用程序)

由于不同设备之间的奇怪行为有所不同,这可能意味着它们在拦截和处理URL意图方面实现了细微的差别,并且/或者它只是一个不同的Android版本(pre-O与O +)。

也可以,将common.handle_all_urls的多个软件包名称与单个网站域名相关联时,当系统尝试在您的应用上线时尝试验证关联时,可能会导致一些其他行为。

答案 1 :(得分:1)

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

以下扩展函数是如何将使用 URI 或深层链接的 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)
}

然后你可以简单地做:

intent.convertToSafeDynamicFeatureModuleIntent(context)
startActivity(intent)

可以找到更长的解释here