在之前的关于Presentation的讨论中,
https://blog.csdn.net/aaajj/article/details/90575622
使用了
Display aDisplay = mDisplayManager.getDisplay(5);
的测试形式,这个5是当前的一个辅助屏的id号,可以从
dumpsys display
可以查看到模拟屏幕的信息
Logical Displays: size=2
Display 0:
mDisplayId=0
Display 5:
mDisplayId=5
mLayerStack=5
里看到,这个id号大于0,会发生变化,比如连接hdmi显示屏,每插拔一次,这个id就会变化(增加)。
Display aDisplay = mDisplayManager.getDisplay(5);的写法只适用于初步调试,
可以修改为Display aDisplay = mDisplayManager.getDisplay(0);来查看Presentation在主屏上的显示效果。
正确的获取Display的方法还是要用正常的方式,
调用DisplayManager的getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION) 方法,
getDisplays得到系统中存在的Presentation屏幕列表,可能是wifi投屏,HDMI投屏或者虚拟显示屏,见code,
所以我们测试Presentation的时候,可以使用开发者模式中绘图的
Simulate secondary displays (模拟辅助显示设备)开关
或者连接hdmi设备,比如使用type-c转接器连接显示器,投影仪等
创建了几个辅助显示设备,getDisplays就获取到几个,一般只会有一个,所以一般情况下取其[0]即可,这个需根据实际情况处理。
Display有getDisplayId()方法可以获取其对应的displayId
345 public Display[] getDisplays(String category) { 346 final int[] displayIds = mGlobal.getDisplayIds(); 347 synchronized (mLock) { 348 try { 349 if (category == null) { 350 addAllDisplaysLocked(mTempDisplays, displayIds); 351 } else if (category.equals(DISPLAY_CATEGORY_PRESENTATION)) { 352 addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_WIFI); 353 addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_HDMI); 354 addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_OVERLAY); 355 addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_VIRTUAL); 356 } 357 return mTempDisplays.toArray(new Display[mTempDisplays.size()]); 358 } finally { 359 mTempDisplays.clear(); 360 } 361 } 362 }
参考资料
https://blog.csdn.net/m0_37657556/article/details/88187975