是否有可能为许多不同应用程序使用的库项目提供私有(private)(已导出=假)ContentProvider?

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

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

<provider
    android:authorities="${applicationId}.provider.test"
    android:name=".storage.db.MyContentProvider"
    android:exported="false" />

但是我找不到解决方案来在运行时生成代码中的权限来正确初始化UriMatcher。
BuildConfig.APPLICATION_ID返回库项目的ID,而不是应用程序的ID。
我可以尝试从应用程序的上下文中获取packageId,但是如果应用程序使用具有不同appIds的 flavor ,那不是最好的解决方案。

所以我解决这个问题的想法是:
  • 在运行时在我的库代码中找到正确的appplicationId(同样,当使用具有不同应用程序ID的 flavor 时)
  • 在我不知道权限的情况下找到一种方法来正确匹配我的UriMatcher中的URI。
  • 最佳答案

    我能够根据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;
    }
    

    10-06 06:35