3

我正在尝试使用 Android App Links 打开一个 Activity。Activity 位于动态功能模块中,位于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 会显示应用程序选择器对话框,其中两次显示相同的应用程序:

结果

你知道为什么会这样吗?这是预期的行为吗?

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>

更新:我忘了提:我用我的更改了示例项目的应用程序 ID,并将著名的 Json 放在我的网站上。我使用 App Links Assistant 进行了检查,一切正常。

4

2 回答 2

0

这似乎是使用 URI 意图的动态功能中的错误,已在此处报告。对于 google 示例 repo,此处报告了错误我现在可以给出的唯一可能的解决方案是,暂时我们可以使用反射来制作这项工作。

  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函数中使用应用程序包名活动类名。但是,这不是官方推荐的方法。有关更多信息,请查看

于 2019-09-04T11:44:20.040 回答
0

使用具有动态功能的 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)
}

然后你可以简单地做:

intent.convertToSafeDynamicFeatureModuleIntent(context)
startActivity(intent)

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

于 2021-01-03T19:54:14.130 回答