即使在 Lollipop 之前,如何获取当前设备的用户列表?

Posted

技术标签:

【中文标题】即使在 Lollipop 之前,如何获取当前设备的用户列表?【英文标题】:How to get a list of users for the current device, even before Lollipop? 【发布时间】:2015-04-30 19:40:29 【问题描述】:

背景

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

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

问题

我找不到很好的方法,甚至不使用 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" ,但显然这是一个 "signature|system" 权限,这并不容易。

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

问题

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

【问题讨论】:

你在这里完全走错了路。 getPackagesForUid 用于检索使用特定 Linux UID 的 Android 软件包列表。通常,每个 Android 用户的每个包都有一个 Linux UID,例如,包 A 可能对 Android 用户 A 使用 UID 10100,对 Android 用户 B 使用 UID 20100,包 B 可能对 Android 用户 A 使用 UID 10101,对 Android 使用 UID 20101用户 B。这些都与用户序列号无关。 该函数被称为getPackagesForUid并返回一个数组,因为具有相同数字签名的应用可以共享一个UID,但这并不常见,不推荐用于非系统应用。 @j__m 计划是找到用户,因为每个项目都可能有一个唯一的 ID。无论如何,它没有工作。你知道如何获取设备的用户数吗?我什至不需要他们的名字或身份证。到底有多少。 据我所知,只有当用户在每个用户帐户下安装您的应用程序时才有可能。当应用程序安装在多个用户帐户下时,每个用户帐户都有自己的应用程序进程,并且可以编写允许每个进程发现并与其他进程通信的代码;这是我做过的事情。但是,仅安装在一个用户帐户下的应用甚至无法检测到没有 MANAGE_USERS 或 INTERACT_ACROSS_USERS 的其他帐户,并且这两个权限都无法获得。 @j__m 所以没有办法吗? :( 【参考方案1】:

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

【讨论】:

有趣。谢谢你。为努力+1。一直都是这样吗? 这是应用程序从至少 android 4.2 开始存储其私人数据的地方。 在“/mnt/user/”中看到至少一个文件夹是否意味着有多个用户? 我不知道“/mnt/user/”是什么。现在,“/data/user/”的使用已成为标准配置,即使在单用户安装(例如 Android TV)上也是如此。 只是“/mnt/user/”在非root设备上可读。

以上是关于即使在 Lollipop 之前,如何获取当前设备的用户列表?的主要内容,如果未能解决你的问题,请参考以下文章

用于 Pre-Lollipop 设备的具有弯曲背景的 Android Ripple 按钮

如何获取我的设备的当前位置 [重复]

Lollipop:获取热门活动名称

在 Android 5.0 Lollipop 上不支持 calendarViewShown

Android Lollipop 成为设备管理员不起作用

Lollipop 设备的共享元素转换崩溃