You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android O中ActivityManager.getCurrentUser()不可用,如何获取当前用户ID?

获取Android多用户场景下活跃用户ID的替代方案

Hey,针对你开发多配置文件应用时需要获取当前活跃用户ID的需求,我整理了几个可行的替代方案,帮你避开被@hide标注的ActivityManager.getCurrentUser()方法:

方案一:使用UserHandle.myUserId()(推荐)

这是最简单且官方支持的方法,从API 17开始就可用,不需要额外权限,直接返回当前进程所属的用户ID,完美适配多用户/工作配置文件场景:

import android.os.UserHandle;

int currentUserId = UserHandle.myUserId();

这个返回值和你通过adb shell pm list users看到的用户ID(比如0、10)完全一致——因为每个配置文件的应用进程都运行在对应的用户空间下,所以它能准确获取当前活跃用户的ID,完全满足你的需求。

方案二:通过UserManager获取系统活跃用户(需系统权限)

如果你的应用是系统级应用,且拥有android.permission.INTERACT_ACROSS_USERS_FULL权限,可以通过UserManager获取当前系统中活跃的用户:

import android.content.Context;
import android.os.UserManager;
import android.os.UserHandle;

UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
for (UserHandle user : userManager.getActiveUsers()) {
    if (userManager.isUserRunning(user)) {
        int currentUserId = UserHandle.getIdentifier(user);
        // 这里得到的就是当前系统活跃的用户ID
        break;
    }
}

注意:这个方法仅限系统应用使用,普通第三方应用无法获取所需权限,所以只适合特定场景。

方案三:反射调用隐藏的ActivityManager.getCurrentUser()(不推荐)

虽然ActivityManager.getCurrentUser()被@hide标注,但可以通过反射强行调用,不过这种方式存在兼容性风险——系统可能在后续版本移除或修改该方法,所以不建议在生产环境使用:

import android.app.ActivityManager;
import android.content.Context;
import java.lang.reflect.Method;

try {
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    Method method = ActivityManager.class.getMethod("getCurrentUser");
    int currentUserId = (int) method.invoke(am);
} catch (Exception e) {
    e.printStackTrace();
    // 反射失败时记得回退到方案一
}

补充说明

对于普通第三方应用,方案一是最优选择:它不需要任何权限,符合系统规范,且能准确获取当前应用所属的用户ID,这正是你在多配置文件场景下需要的活跃用户标识。

内容的提问来源于stack exchange,提问作者Lukas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:43