如何获得当前设备的用户列表,甚至在棒棒糖之前?

时间:2015-02-27 23:37:01

标签: android android-package-managers multi-user usermanager

背景

自API 17(Jelly Bean)以来,Android用户可能有多个用户使用同一设备。一开始它只适用于平板电脑,但在Lollipop(API 21)上它也适用于智能手机。

我正在尝试查看当前用户在当前设备的其他用户之间共享的应用程序,以便我可以知道是否应该通知用户可以为所有用户执行卸载(关于{ {3}})。那是因为我制作了一款可以管理和卸载应用的应用(here)。

问题

我找不到一种很好的方法,甚至没有使用root。

我尝试了什么

我认为我找到了一种方法,使用“here”和“UserManager”这样做:

UserManager um=(UserManager)getSystemService(Context.USER_SERVICE);
final PackageManager packageManager=getPackageManager();
Log.d("AppLog","users count:"+um.getUserCount());
for(UserHandle userHandle : um.getUserProfiles()){
  final long serialNumberForUser=um.getSerialNumberForUser(userHandle);
  Log.d("AppLog","serial number:"+serialNumberForUser);
  final String[] packagesForUid=packageManager.getPackagesForUid((int)serialNumberForUser);
  StringBuilder sb=new StringBuilder();
  for(String packageName : packagesForUid){
    sb.append(packageName+" ");
  }
  Log.d("AppLog","packages:"+sb.toString());
}

然而,它有一些问题: - 函数“PackageManager”需要API 21及更高版本。 - 函数“getUserProfiles”需要一个“int”参数,而我有一个“long”变量(来自“getPackagesForUid”)。不确定这是否真的是正确的方法。 - 我在“UserManager”类上使用的大多数(或全部?)函数需要一个权限“MANAGE_USERS”,但显然这是一个“签名系统”权限,这是不容易的。

所以它不起作用,崩溃。

问题

有没有找到这些信息?其他用户也安装了哪些应用程序?

1 个答案:

答案 0 :(得分:1)

如果您具有root访问权限,并且Android不再次更改目录结构,则可以枚举/data/user/的内容。每个子目录代表一个用户,每个二级子目录代表一个已安装的应用程序,例如/data/user/0/com.example.maypp/data/user/1/com.example.someotherapp