0

背景

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

我正在尝试检查当前用户拥有哪些应用程序与当前设备的其他用户共享,以便我可以知道是否应该通知用户可以为所有用户完成卸载(写在这里)。那是因为我制作了一个可以管理和卸载应用程序的应用程序(这里)。

问题

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

我试过的

我想我已经找到了一种方法,通过使用“ UserManager ”和“ PackageManager ”:

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

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

所以它不起作用,并且崩溃。

问题

无论如何都可以找到这些信息吗?还为其他用户安装了哪些应用程序?

4

1 回答 1

1

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

于 2015-08-21T12:22:31.563 回答