android库项目中的ContentProvider

时间:2017-03-13 07:43:13

标签: android android-contentprovider

对于许多不同应用程序使用的库项目,是否可以使用private(exported = false)ContentProvider?

问题在于,即使未导出CP,也必须具有唯一的权限。如果它不是唯一的,那么您无法在同一部手机上安装具有相同库的多个应用程序(INSTALL_FAILED_CONFLICTING_PROVIDER)。

我知道我可以使用应用程序ID在AndroidManifest中定义提供程序,如下所示:

721Z3121-3

但我无法找到在运行时生成代码中的权限以正确初始化UriMatcher的解决方案。

<provider android:authorities="${applicationId}.provider.test" android:name=".storage.db.MyContentProvider" android:exported="false" /> 返回库项目的ID,而不是应用程序。 我可以尝试从应用程序的上下文中获取packageId,但如果应用程序使用具有不同appIds的风格,那么它不是最佳解决方案。

所以解决这个问题的想法是:

  • 在运行时在我的库代码中找到合适的appplicationId(当使用具有不同应用程序ID的flavor时)
  • 在不了解权限的情况下找到一种正确匹配UriMatcher中URI的方法。

2 个答案:

答案 0 :(得分:4)

我能够根据找到的答案here在运行时获得权限。解决方案如下(API 9 +)

private static String getAuthority(final Context appContext) throws PackageManager.NameNotFoundException {
  final ComponentName componentName = new ComponentName(appContext, MyContentProvider.class.getName());
  final ProviderInfo providerInfo = appContext.getPackageManager().getProviderInfo(componentName, 0);
  return providerInfo.authority;
}

答案 1 :(得分:-1)

不幸的是,唯一的方法是请求使用您的库的应用程序的开发人员以其独特的权限将标记添加到他们的AndroidManifest.xml。