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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...