Android: 如何找出内容解析器的客户端

Android: How to figure out the client of content resolver

我目前正在从事一个项目,该项目将过滤掉来自特定应用程序的某些特定查询到 android 通讯录。我想知道如何确定哪个应用程序正在访问联系人提供程序?我查看了 API 参考资料,但看起来只有获取内容提供商客户端的方法,而不是获取请求访问数据的应用程序的方法。如果有人能稍微解释一下,那将是很大的帮助!提前致谢!

从您的 ContentProvider 中,您可以获取像这样调用您的应用程序包名称:

@NonNull
private static Collection<String> getCallingPackages(Context context) {
    int callingUid = Binder.getCallingUid();
    if (callingUid == 0) {
        return Collections.emptyList();
    }

    String[] packages = context.getPackageManager().getPackagesForUid(callingUid);

    return new ArrayList<>(Arrays.asList(packages));
}

然后您可以检查包是否在您维护的 whitelist/blacklist 上。