也许标题有点误导。我的问题是我有一个Android库项目,它在两个标准的Android项目之间共享:一个用于免费版本的应用程序,另一个用于付费版本。该库目前具有ContentProvider的代码,包括具有多个静态String变量的契约类,例如URI和列名称。现在我希望URI的“权限”根据使用该库的应用程序而改变。想到的一个解决方案是将权限存储为字符串资源,并在运行时将该字符串加载到静态最终String变量中。但是,我不知道如何做到这一点,因为契约类有一个私有构造函数而没有Context对象来加载字符串资源。还有哪些其他选择可以解决我的问题?
答案 0 :(得分:22)
对于那些使用较新版本的构建工具的人来说,这是一个更好的解决方案:相对于您的软件包名称设置权限。您可以使用${applicationId}
自动执行此操作,该<provider
android:name=".MyContentProvider"
android:authorities="${applicationId}.provider"/>
会在构建过程中扩展为您应用的程序包名称。
com.example.app.paid
我们假设您的软件包名称为com.example.app.free
和com.example.app.paid.provider
。在构建应用时,权限将相应地变为com.example.app.free.provider
和BuildConfig.APPLICATION_ID + ".provider"
。
要在代码中引用提供程序权限,请使用PrintWriter
。
答案 1 :(得分:6)
在用户尝试安装这两个版本的情况下,使用免费和付费版本的不同权限是有意义的。 我正在为清单中的两个版本定义不同的权限,如下所示:
<provider
android:name="MyApp.MyProvider"
android:authorities="MyApp.MyProvider.free"
android:grantUriPermissions="true"/>
然后我在xml文件中配置提供程序(我使用一个特殊的config.xml文件,因为我有更多的配置数据,如提供程序权限,但你当然可以使用strings.xml):
<string name="my_provider_authority">MyApp.MyProvider.free</string>
代码以任何其他字符串资源的形式检索提供者权限。要在没有上下文的情况下访问字符串资源,请使用应我正在使用应用程序类从我的应用程序中的任何位置访问应用程序上下文(但有两个例外):
public class MyApplication extends Application {
private static Context sContext;
@Override
public void onCreate() {
super.onCreate();
sContext = this;
}
public static Context getContext() {
return sContext;
}
}
当然,您需要在清单中定义MyApplication。 这允许您从应用程序的任何位置访问字符串和其他资源。 但有两个例外:
答案 2 :(得分:0)
为什么要改变权威呢?您不需要导出提供程序,这意味着除了解构应用程序之外,没有人甚至可以看到权限名称。即便如此,他们也无法访问提供商。
如果是为了您自己的内部便利,那么我将使用相同的权限,但在URI上使用不同的安全性。
简而言之,你的想法很有趣,但我不这样做。太乱了。