android库项目中的ContentProvider

LR8*_*R89 8 android android-contentprovider

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

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

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

<provider
    android:authorities="${applicationId}.provider.test"
    android:name=".storage.db.MyContentProvider"
    android:exported="false" />
Run Code Online (Sandbox Code Playgroud)

但我找不到一个解决方案来在运行时生成代码中的权限来正确初始化UriMatcher.

BuildConfig.APPLICATION_ID返回库项目的ID,而不是应用程序.我可以尝试从应用程序的上下文中获取packageId,但如果应用程序使用具有不同appIds的flavor,则不是最佳解决方案.

所以我的想法是:

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

LR8*_*R89 6

我能够根据此处找到的答案在运行时获得权限。解决方案如下(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;
}
Run Code Online (Sandbox Code Playgroud)