android库项目中的FileProvider权限


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

点赞