如何在 Android 中找出内容提供者的调用活动?
Posted
技术标签:
【中文标题】如何在 Android 中找出内容提供者的调用活动?【英文标题】:How to find out a calling activity for content provider in Android? 【发布时间】:2014-08-21 18:57:30 【问题描述】:据我了解,在 android 中,内容提供者的实现不关心也不应该关心哪个应用程序正在请求数据。只要调用应用程序具有访问数据所需的权限,实现就应该根据请求的 URI 返回数据。但是,我正在我的内容提供程序中尝试一些不同的东西,并且需要在响应数据查询之前找出哪个应用程序正在调用提供程序。有没有办法让我的内容提供商找到这个?任何帮助都感激不尽。
【问题讨论】:
【参考方案1】:假设您只想知道是您的应用程序访问提供者还是第三方应用程序访问提供者,您可以致电ContentProvider.getCallingPackage()
,查看返回的包名是否与您的应用程序的包名匹配。
编辑:对于 API 级别 18 及之前的版本,我知道有一种解决方法。这是一种解决方法,因此并不理想,但它确实有效:将一些额外的数据附加到 URI 以识别您的应用程序。
例如,如果您的提供商的 URI 通常为 content://com.example.app/table1
,那么您的应用将使用 URI content://com.example.app/table1/identifier
。您可以将两种 URI 模式添加到您的 UriMatcher
中,对每种模式使用不同的代码。通过您的合同类使不带标识符的 URI 公开可用,但保持标识符私有。第三方将根据您的合同类中公开的内容构建 URI,因此不会在 URI 中包含标识符。构建 URI 时,请包含标识符。因此,两个 URI 将指向相同的数据,但您可以根据匹配器从 match(Uri uri)
返回的代码来区分您自己的应用程序和第三方应用程序。它也不会干扰ContentResolver
,因为解析器只检查URI 的权限部分。同样,这假设您只关心区分来自您的应用的调用。
【讨论】:
一句警告,您需要 API 级别 19 (KitKat) 才能使用该方法。 API 级别 18 的任何替代方案? @RocketRandom 发布了针对 API 18 及更低版本的解决方法的编辑。 我试图找出谁在特定时间点启动了默认的 android 联系人提供程序(在我杀死它并正在清理它之后)。我已经有办法知道是不是我的应用程序启动了它(但事实并非如此)。我需要区分也使用提供程序的默认 android 应用程序 - 我可以,但我不想全部修改它们 @RocketRandom 在您的情况下,听起来您需要提供程序具有诸如getCallingPackage()
之类的方法,以便您可以将其传递给系统以识别应用程序。在 API 19 之前,我不知道有什么方法可以做到这一点。以上是关于如何在 Android 中找出内容提供者的调用活动?的主要内容,如果未能解决你的问题,请参考以下文章