android库项目中的FileProvider权限

时间:2017-05-19 15:28:42

标签: android android-manifest android-library 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?

2 个答案:

答案 0 :(得分:1)

正如评论中提到的CommonsWare一样,在${applicationId}部分中使用动态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>

CommonsWare博客上的更详尽的解释: https://commonsware.com/blog/2017/06/27/fileprovider-libraries.html

答案 1 :(得分:0)

在库清单中放置如下代码:

<provider
android:name="YOUR LIBRARY FILE PROVIDER CLASS"
android:authorities="${applicationId}.library.file.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/provider_paths"
    tools:node="merge" />

然后在您的 sdk 中有一个如下所示的类,然后使用来自消费者应用程序或您的 sdk 内容提供者的上下文对其进行初始化。

object SDK {

  lateinit var fileProviderAuthority: String

  fun init(context: Context) {
   fileProviderAuthority = "${context.packageName}.library.file.provider"
  }

}

当您需要文件 uri 操作的 fileAuthority 字符串时,请使用它,如下所示:

val uri = FileProvider.getUriForFile(this, SDK.fileProviderAuthority,File(FILE_PATH))

要阅读更多信息,请点击 here