Android库项目中的ContentProvider

9

一个库项目是否可以有私有的(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,而不是应用程序的ID。我可以尝试从应用程序上下文中获取packageId,但如果应用程序使用具有不同appId的flavors,则这不是最佳解决方案。
因此,我的解决方法是:
1. 在运行时查找适当的应用程序ID(即使使用具有不同应用程序ID的flavors)。 2. 找到一种在没有关于authority的知识的情况下正确匹配我的UriMatcher的方法。

如果您的所有应用程序都使用相同的密钥进行签名,则可能正在寻找名为protectionLevel = signature的东西,请查看此处https://dev59.com/x2025IYBdhLWcg3wQDhb和此处https://dev59.com/1H_aa4cB1Zd3GeqPyQ9E,我没有详细使用或阅读,但主要思想是仅允许使用相同密钥签名的应用程序访问提供程序。 - Yazan
我不拥有使用我的库的应用程序,因此解决方案对应用程序开发人员应该是透明的。 - LR89
2个回答

6

我能够在运行时根据找到的答案(这里)获得权限。解决方案如下(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;
}

1
何时调用此方法? - mudit_sen

-1

不幸的是,唯一的方法是请求使用您的库的应用程序开发人员在其AndroidManifest.xml中添加带有其唯一权限的标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接