在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?
答案 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