是否可以请求对特定内容Uri的读取权限?

时间:2015-12-01 22:27:33

标签: android

背景

我有一个日记应用,允许用户将照片附加到相机或存储中的条目。该应用程序以 content:// Uri字符串的形式存储对数据库中图像文件的引用。这看似可靠。

现在我想创建一个更基本的应用程序的免费版本,但是如果用户选择升级,我需要包含一种将数据导入更高级应用程序的机制。这可以通过导出的ContentProvider轻松完成,但是尝试从内容Uris读取会导致SecurityException,因为它是一个不同的应用程序。

问题

是否可以请求对已知Uri的持久读取权限?我知道如何在takePersistableUriPermission Intent返回的Uri上使用ACTION_OPEN_DOCUMENT,但是我没有办法用特定的Uri做到这一点。

潜在解决方案

  1. 使用带有应用内购买的单个应用来解锁所有功能。我想避免的原因是它依赖于Google Play,免费版本的文件大小将不必要地大。
  2. 对两个应用使用相同的sharedUserId,以便共享其权限。在这种情况下,这是不可能的,因为现有用户将无法升级。
  3. content:// Uris转换为file:// Uris,并在接收应用中创建新内容Uri。当然,对于所有内容Uris来说这是不可能的,但它总比没有好。

2 个答案:

答案 0 :(得分:1)

对我的问题的简短回答似乎是否定的。

据我所知,从文档中可以看出,内容提供商必须为ACTION_OPEN_DOCUMENT Intent返回的数据使用takePersistableUriPermission提供可持久的Uri权限。似乎没有办法请求访问特定Uri的权限。

为了解决这个问题,我决定将内容Uris视为易失性,并将数据复制到外部存储上公共应用专用目录中的文件中。然后我只存储文件名并在需要时重建完整路径。这使得数据库与文件结构无关,数据更具可移植性。缺点是它会复制数据并占用更多存储空间。

答案 1 :(得分:0)

我认为你必须实施第一名 您可以使用“flavors”Gradle执行多个版本: 这没什么复杂的: 建立一个支付的味道(全部为白色)。 建立一个自由的味道(较小)。

productFlavors {
paid {
    applicationId = "com.vogella.android.gradlebuildflavors.paid"
    versionName = "1.0-paid"
}

free {
    applicationId = "com.vogella.android.gradlebuildflavors.free"
    versionName = "1.0-free"
}
} 

教程:

http://www.vogella.com/tutorials/AndroidBuild/article.html