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

无需Root权限,如何检测Android应用是用户直接打开还是远程访问启动?

Android远程访问工具(含PhoneLink)无Root检测方案

一、基于Android原生API的核心检测方法

1. 检测虚拟显示(适用于Android 7.0+)

远程控制工具(包括PhoneLink)通常会创建虚拟显示实现屏幕镜像或控制。通过DisplayManager获取所有显示设备,判断是否存在标记为FLAG_VIRTUAL的虚拟显示:

public boolean hasVirtualDisplay(Context context) {
    DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
    Display[] displays = displayManager.getDisplays();
    for (Display display : displays) {
        if ((display.getFlags() & Display.FLAG_VIRTUAL) != 0) {
            return true;
        }
    }
    return false;
}

2. 识别远程工具进程

直接检测设备中是否运行目标远程工具的进程,通过ActivityManager获取正在运行的进程列表,匹配已知远程工具的包名:

public boolean isRemoteToolRunning(Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
    if (runningProcesses == null) return false;

    // 常见远程工具包名集合,可按需补充
    Set<String> remotePackageNames = new HashSet<>(Arrays.asList(
        "com.microsoft.appmanager",    // PhoneLink
        "com.anydesk.anydeskandroid",   // AnyDesk
        "com.teamviewer.quicksupport.market"  // TeamViewer
    ));

    for (ActivityManager.RunningAppProcessInfo process : runningProcesses) {
        if (remotePackageNames.contains(process.processName)) {
            return true;
        }
    }
    return false;
}

3. 检测非本地输入源

远程控制的输入事件通常来自非触摸设备(如鼠标、虚拟输入),通过InputManager检查输入设备的来源类型:

public boolean hasRemoteInputSource(Context context) {
    InputManager inputManager = (InputManager) context.getSystemService(Context.INPUT_SERVICE);
    int[] deviceIds = inputManager.getInputDeviceIds();
    for (int deviceId : deviceIds) {
        InputDevice device = inputManager.getInputDevice(deviceId);
        if (device == null) continue;

        int sources = device.getSources();
        // 匹配鼠标、触摸板、手写笔等非触摸输入源
        if ((sources & InputDevice.SOURCE_MOUSE) != 0 ||
            (sources & InputDevice.SOURCE_TOUCHPAD) != 0 ||
            (sources & InputDevice.SOURCE_STYLUS) != 0) {
            return true;
        }
    }
    return false;
}

二、针对PhoneLink的特殊检测优化

PhoneLink远程控制较为隐蔽(无显性通知),可结合以下两点提升准确率:

  • 同时检测com.microsoft.appmanager进程存在+虚拟显示存在,避免误判仅后台运行PhoneLink未远程控制的情况;
  • Android 12+可监听MediaProjection状态变化:PhoneLink发起远程控制时会申请MediaProjection权限,可通过注册广播或监听权限回调判断(此方法仅在权限申请时触发,无法持续检测)。

三、方案建议

  1. 组合检测:将三种方法结合使用(如虚拟显示+进程检测),大幅降低误判率;
  2. 版本兼容:Android 6.0及以下设备重点依赖进程检测(FLAG_VIRTUAL在7.0才引入);
  3. 避免误杀:排除投屏类APP(如Google Cast)的包名,进一步优化检测逻辑;
  4. 持续检测:通过Handler定时执行检测任务,或在应用启动、敏感操作前触发检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:52:39