Android开发:如何将动态applicationId对应的权限传入String.xml?
实现将动态applicationId传入string.xml指定字段
要把${applicationId}.provider这个动态值注入到string.xml的freshchat_file_provider_authority字段中,不能直接在string.xml里写占位符(资源文件不支持解析这种Gradle变量),得通过Gradle动态生成资源来实现,步骤如下:
- 打开模块级的
build.gradle文件(通常是app/build.gradle) - 在
android闭包内的defaultConfig节点下添加resValue配置,代码如下:
android { defaultConfig { // 保留你原有的其他配置(比如minSdkVersion、targetSdkVersion等) resValue "string", "freshchat_file_provider_authority", "${applicationId}.provider" } }
原理说明
Gradle会在构建过程中自动生成对应的字符串资源,替换你string.xml里的空字段。构建完成后,你可以在build/generated/res/resValues/[buildType]/values/generated.xml文件中看到生成的内容,格式类似:
<string name="freshchat_file_provider_authority" translatable="false">com.your.package.provider</string>
注意事项
- 如果你有多个产品风味(productFlavors),可以在每个flavor节点下单独配置,或者在
defaultConfig中统一配置(applicationId会自动适配不同flavor的变体) - 无需手动修改string.xml里的
freshchat_file_provider_authority内容,Gradle生成的资源会覆盖原有定义
你的原有代码参考
AndroidManifest.xml中的provider配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/freshchat_file_provider_paths" tools:replace="android:resource" /> </provider>
string.xml中的原有字段:
<string name="freshchat_file_provider_authority"></string>
内容的提问来源于stack exchange,提问作者Nikhil Masurkar
相关产品推荐
相关产品推荐

