如何检测Android合法投屏并排除Android Auto?
检测真实投屏并排除Android Auto误判
核心结论
Android Auto确实会被DisplayManager.getDisplays()识别为额外的Display(属于TYPE_VIRTUAL类型的虚拟显示),因此直接通过Display数量>1的判断逻辑会误判。要区分真实投屏(如Miracast、Chromecast)和Android Auto,需要结合Display的类型和类别属性来筛选。
解决方案
真实投屏的Display通常属于TYPE_EXTERNAL类型,且被归类到DISPLAY_CATEGORY_PRESENTATION(专门用于投屏演示的显示类别),而Android Auto的虚拟显示不会满足这两个条件。可以通过以下步骤实现准确检测:
- 获取DisplayManager实例
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
- 筛选符合真实投屏特征的Display
boolean hasRealScreenMirroring = false; // 遍历所有显示设备 for (Display display : displayManager.getDisplays()) { // 优先判断类型:真实投屏为外部显示类型 if (display.getType() == Display.TYPE_EXTERNAL) { // 检查是否属于投屏演示类别 String[] displayCategories = display.getDisplayCategories(); for (String category : displayCategories) { if (DisplayManager.DISPLAY_CATEGORY_PRESENTATION.equals(category)) { hasRealScreenMirroring = true; break; } } if (hasRealScreenMirroring) break; } }
- 简化判断(直接获取Presentation类别显示)
也可以直接获取所有属于DISPLAY_CATEGORY_PRESENTATION的Display,这类显示就是真实的投屏设备,Android Auto不会被包含在内:
Display[] presentationDisplays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); boolean hasRealScreenMirroring = presentationDisplays.length > 0;
原理说明
TYPE_EXTERNAL:代表物理连接或无线投屏的外部显示设备(如电视、投影仪)。DISPLAY_CATEGORY_PRESENTATION:系统为投屏场景定义的专属类别,只有用于镜像或演示的外部显示才会被标记该属性。- Android Auto的虚拟显示属于
TYPE_VIRTUAL,是为车机交互创建的专用虚拟屏,不属于上述两类,因此会被排除。
内容的提问来源于stack exchange,提问作者user1118764
相关产品推荐
相关产品推荐

