android - android库项目中的ContentProvider

标签 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" />

但我找不到在运行时在代码中生成权限以正确初始化 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/

相关文章:

android - 如何从 URI 加载 Picasa 图片?

android - 如何使用GreenDAO生成Content Provider?

android - 如何访问短信和联系人数据?

android - 如果手机( native )中存在多条未读短信,如何通知从 native (手机)读取了哪些短信?

android - 在android模拟器中运行应用程序时出错

android - Android学习应用程序存储数据的方法有哪些

android - 从停止播放的时间继续播放音频

内容的 Widget RemoteViewsFactory 中的 Android 权限拒绝

android - xml中的渐变不会出现在按钮上

android - 扩展 AppCompatActivity 后我的搜索栏出现错误