Jon*_*nas 5 android android-manifest android-library android-fileprovider
在一个库项目中,我使用FileProvider并将我的库 applicationId 作为其权限。现在,当有人在他的应用程序的两种版本中使用这个库时,由于 FileProvider 冲突,第二个版本将无法安装。
目标
能够为应用程序的每个变体为我的库 FileProvider 定义唯一的权限。
第一种方法
我向权限附加了一个随机整数,效果很好。
构建.gradle
static def generateContentProviderAuthority() {
Random random = new Random()
return new StringBuilder()
.append("application.id.of.my.library")
.append(".fileprovider")
.append(String.valueOf(random.nextInt(100000)))
.toString()
}
defaultConfig {
...
manifestPlaceholders= [contentProviderAuthority: generateContentProviderAuthority()]
}
Run Code Online (Sandbox Code Playgroud)
显现
<provider
android:name=".helper.FileProvider"
android:authorities="${contentProviderAuthority}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>
</provider>
Run Code Online (Sandbox Code Playgroud)
但是现在清单更改了每个构建,这与即时运行和其他东西混在一起......
解决方案
是否可以在我的库 build.gradle 中获取使用该库的应用程序的确切 applicationId?
${applicationId}正如 CommonsWare 在评论中提到的,在该部分中使用动态就足够了authorities。
<provider
android:name=".ScreenshotFileProvider"
android:authorities="${applicationId}.library.name.screenshots"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"/>
</provider>
Run Code Online (Sandbox Code Playgroud)
CommonsWare 博客中有更详尽的解释: https://commonsware.com/blog/2017/06/27/fileprovider-libraries.html
| 归档时间: |
|
| 查看次数: |
2423 次 |
| 最近记录: |