据我了解,在Android中,内容提供商的实现不会也可能不应该关注哪个应用程序正在请求数据。只要调用应用程序具有访问数据所需的权限,实现就应该根据请求的URI返回数据。但是,我在内容提供程序中尝试不同的东西,并且需要在响应查询数据之前找出哪个应用程序正在调用提供程序。我的内容提供商有没有办法找到它?任何帮助都感激不尽。
答案 0 :(得分:3)
假设您只想知道是您的应用程序访问提供程序还是访问提供程序的第三方应用程序,您可以致电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的权限部分。同样,这假设您只关心区分来自您应用的呼叫。