【问题标题】:Can't find getUsers() method in class UserManager在 UserManager 类中找不到 getUsers() 方法
【发布时间】:2017-10-31 19:56:25
【问题描述】:

如何列出 Android 设备上的所有用户?

我尝试了两种方法:

1。 UserManager.getUsers()

android source 中,UserManager 类中似乎有一个getUsers() 方法可以满足我的需要。但是android reference没有提到方法,Android Studio也无法解析方法。

此外,来源显示getUsers()返回UserInfo类型(import android.content.pm.UserInfo;),但它也不在文档或Android Studio中。

2。 UserManager.getUserProfiles()

此方法记录在android reference

创建一些虚拟用户:

adb shell pm create-user dummy1
adb shell pm create-user dummy2

致电getUserCount() 确认现在有 3 个用户。但是,getUserProfiles() 仍然只返回列表中的一项!

这可能是因为个人资料与用户不同。所以我尝试了一些 create-user 的变体,以下看起来很有希望:

adb shell pm remove-user dummy1
adb shell pm remove-user dummy2
adb shell pm create-user --profileOf 0 --managed profile1
adb shell pm create-user --profileOf 0 --managed profile2

请注意,无法创建 profile2 (Error: couldn't create user.)

这一次,调用getUserCount() 确认现在有 2 个用户。此外,getUserProfiles() 确认列表中有 2 个项目。不幸的是,似乎只能创建一个这种类型的用户,这对我来说没有用,因为我需要几个额外的用户。

所以这仍然不能回答我原来的问题。

解决方案:反射

getUsers() 是隐藏的,所以使用反射来访问它:

Method method = um.getClass().getMethod("getUsers", null);
Object users = method.invoke(um, null);

警告:由于它是隐藏的,因此无法保证 API 将来不会更改。

【问题讨论】:

    标签: android


    【解决方案1】:

    该方法被@hide 隐藏。该方法还需要系统权限android.Manifest.permission.MANAGE_USERS。此权限不能授予第三方应用。

    UserManager#getUsers() 文档:

    返回此设备上所有用户的信息,包括那些 标记为删除。要仅检索活着的用户,请使用 获取用户(布尔值)。

    需要 android.Manifest.permission.MANAGE_USERS 权限。

    返回: 设备上存在的用户列表。


    如何列出 Android 设备上的所有用户?

    根据this的回答,你可以使用getUserProfiles

    【讨论】:

    • android.Manifest.permission.MANAGE_USERS 可以授予具有平台密钥的第三方应用程序。这对于在 Android 模拟器映像上运行的应用程序很容易授予,因为它们是使用 default platform key 构建的。
    • 我认为您的回答可能会帮助我解决问题,因为您将我指向 @hide 装饰器。我使用反射调用隐藏方法,它似乎返回设备上的所有用户。请参阅 OP 以获取解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2023-03-17
    • 2018-04-02
    相关资源
    最近更新 更多