android库项目中的FileProvider权限

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?

Ant*_*nit 7

${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

  • 使用“FileProvider.getUriForFile”时,我仍然需要提供权限。你知道我怎样才能得到它吗?`BuildConfig.APPLICATION_ID` 不可用,因为我在可能包含在任何应用程序项目中的模块中使用提供程序。 (5认同)