一个库项目是否可以有私有的(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