Android 11:使用字符串资源在Android清单中声明包可见性

4
我的应用程序通过queryIntentActivities检测特定应用程序是否已安装。由于我的应用程序针对api 30,所以这种方法不再起作用,因为我缺少了一些清单声明。
这个示例中,他们直接定义包名称。但是我要查询的应用程序在每个构建变体中都不同。因此最好使用字符串资源。然而,这似乎是不可能的。 示例
<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

What I would like

<manifest package="com.example.game">
    <queries>
        <package android:name="@string/store_app" />
        <package android:name="@string/services_app" />
    </queries>
    ...
</manifest>

其他文件

<string name="store_app">com.example.store</string>
<string name="services_app">com.example.services</string>

如何使用字符串资源


1
您可以像示例中那样直接使用软件包名称,但需要为每个构建覆盖清单文件,以便每个构建都有正确的查询列表。 - Adinia
1个回答

7

我使用了 manifestPlaceholders 来解决这个问题,因为我想要一个单独的 AndroidManifest 文件。这种解决方案唯一的缺点是我还需要在字符串资源文件中再次定义应用程序包名称,因为我也在代码中使用它。

AndroidManifest

<manifest package="com.example.game">
    <queries>
        <package android:name="${store_app}" />
        <package android:name="${services_app}" />
    </queries>
    ...
</manifest>

build.gradle

manifestPlaceholders = [store_app: "com.example.store"]

我也尝试了这个解决方案在我的gradle文件中创建字符串资源,但我无法使其工作。


有没有想法如何获取类似于 com.companyName.* 的包? 可能会有多个具有相同前缀但不同后缀的包。 - tronku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接