对内容提供商实施项目所有权

时间:2015-07-25 02:16:56

标签: android android-contentprovider

我有一个导出的内容提供商,在我的几个应用程序之间共享,第三方可以在我发布API后自由编写自己的应用程序。

现在,任何客户端应用程序都可以对内容提供程序中的任何项目执行任何CRUD操作。我想强制执行一些访问权限,以便应用只能修改或删除它创建的项目,同时仍允许任何应用读取提供商中的所有项目并创建新项目。

有什么方法可以访问调用应用程序的UID并将其与新创建的项目一起存储,然后在未来的操作中与该值进行比较?使用包名称会更好吗?我假设如果用户卸载并重新安装了应用程序,UID可能会发生变化,我不希望他们失去对这些项目的访问权限。

1 个答案:

答案 0 :(得分:1)

是的,您可以进行包名检查。以下是根据调用uid检索包名称的方法:

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));
}

这将返回一个包名列表,因为引用文档:

  

在大多数情况下,这将是一个包名称,即已分配该用户ID的包。

     

有多个包通过共享相同的用户ID   &#34; sharedUserId&#34;机制,将返回具有该ID的所有包。