是否有可能为许多不同应用程序使用的库项目提供私有(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 ,那不是最好的解决方案。
所以我解决这个问题的想法是:
最佳答案
我能够根据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;
}