无需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权限,可通过注册广播或监听权限回调判断(此方法仅在权限申请时触发,无法持续检测)。
三、方案建议
- 组合检测:将三种方法结合使用(如虚拟显示+进程检测),大幅降低误判率;
- 版本兼容:Android 6.0及以下设备重点依赖进程检测(
FLAG_VIRTUAL在7.0才引入); - 避免误杀:排除投屏类APP(如Google Cast)的包名,进一步优化检测逻辑;
- 持续检测:通过
Handler定时执行检测任务,或在应用启动、敏感操作前触发检测。
内容的提问来源于stack exchange,提问作者juhbert
相关产品推荐
相关产品推荐

