微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的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;
}

原文地址:https://www.jb51.cc/android/315305.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐