是否可以为被许多不同应用程序使用的库项目提供私有(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" />
但我找不到在运行时在代码中生成权限以正确初始化 UriMatcher 的解决方案。
BuildConfig.APPLICATION_ID
返回库项目的 ID,而不是应用程序。
我可以尝试从应用程序的上下文中获取 packageId,但如果应用程序使用具有不同 appIds 的 flavors,那么这不是最佳解决方案。
所以我解决这个问题的想法是:
- 运行时在我的库代码中找到合适的 appplicationId(当使用具有不同应用程序 ID 的风格时也是如此)
- 在不知道权威的情况下找到一种在我的 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;
}
关于android - android库项目中的ContentProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42758576/