在
library project中,我使用
FileProvider作为其权限的库applicationId.现在有人使用这个库,例如在他的应用程序的两种风格,第二个将不会安装因为FileProviders冲突.
目标
能够为我的库FileProvider为应用程序的每个变体定义唯一的权限.
第一种方法
我将一个随机的int附加到权限,工作得很好.
的build.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()]
}
表现
<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>
但是现在,清单会改变每一个版本,这些版本会因即时运行而变得混乱……
解
是否有可能获得在我的库build.gradle中使用库的应用程序的确切applicationId?
最佳答案 正如CommonsWare在评论中提到的那样,在权限部分使用动态${applicationId}就足够了.
<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>
在CommonsWare的博客上有更详尽的解释:
https://commonsware.com/blog/2017/06/27/fileprovider-libraries.html