迅为RK3588开发板Android多屏显示之多屏同显和多屏异显
<p class="p"> </p><p><span style="font-family: 宋体"> 迅为</span><span style="font-family: Calibri">RK3588</span><span style="font-family: 宋体">开发板是一款低功耗、高性能的处理器,适用于基于</span><span style="font-family: Calibri">arm</span><span style="font-family: 宋体">的</span><span style="font-family: Calibri">PC</span><span style="font-family: 宋体">和</span><span style="font-family: Calibri">Edge</span><span style="font-family: 宋体">计算设备、个人移动互联网设备等数字多媒体应用,</span><span style="font-family: Calibri">RK3588</span><span style="font-family: 宋体">支持</span><span style="font-family: Calibri">8K</span><span style="font-family: 宋体">视频编解码,内置</span><span style="font-family: Calibri">GPU</span><span style="font-family: 宋体">可以完全兼容</span><span style="font-family: Calibri">OpenGLES 1.1</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">2.0</span><span style="font-family: 宋体">和</span><span style="font-family: Calibri">3.2</span><span style="font-family: 宋体">。</span><span style="font-family: Calibri">RK3588</span><span style="font-family: 宋体">引入了新一代完全基于硬件的最大</span><span style="font-family: Calibri">4800</span><span style="font-family: 宋体">万像素</span><span style="font-family: Calibri">ISP</span><span style="font-family: 宋体">,内置</span><span style="font-family: Calibri">NPU</span><span style="font-family: 宋体">,支持</span><span style="font-family: Calibri">INT4/INT8/INT16/FP16</span><span style="font-family: 宋体">混合运算能力,支持安卓</span><span style="font-family: Calibri">12</span><span style="font-family: 宋体">和、</span><span style="font-family: Calibri">Debian11</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">Build root</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">Ubuntu20</span><span style="font-family: 宋体">和</span><span style="font-family: Calibri">22</span><span style="font-family: 宋体">版本登系统。了解更多信息可点击迅为官网 </span></p>
<p> </p>
<p> </p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142226822-1918788274.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">【实验平台】:迅为</span><span style="font-family: Calibri">RK3588</span><span style="font-family: 宋体">开发板</span></p>
<p> </p>
<p><span style="font-family: 宋体">【内容来源】《【北京迅为】</span><span style="font-family: Calibri">itop-3588 </span><span style="font-family: 宋体">开发板多屏显示手册 </span><span style="font-family: Calibri">v1.0</span><span style="font-family: 宋体">》</span></p>
<p> </p>
<p>RK3588 <span style="font-family: 宋体">最多可以支持</span> 7 <span style="font-family: 宋体">个屏幕显示,这主要取决于</span> RK3588 <span style="font-family: 宋体">芯片内置了</span> VOP <span style="font-family: 宋体">控制器,</span></p>
<p><span style="font-family: 宋体">支持四路视频同显或异显,可有效提高行业定制的拓展性。本章节我们将介绍在</span> RK3588 的Android12 <span style="font-family: 宋体">系统上实现多屏显示。</span></p>
<p>1.1 Android 多屏同显</p>
<p>iTOP-RK3588 <span style="font-family: 宋体">开发板支持以下屏幕</span></p>
<p><span style="font-family: 宋体">迅为</span> MIPI 7 <span style="font-family: 宋体">寸屏幕</span></p>
<p><span style="font-family: 宋体">标准</span> HDMI <span style="font-family: 宋体">屏幕(通过</span> HDMI <span style="font-family: 宋体">线连接)</span></p>
<p><span style="font-family: 宋体">迅为</span> <span style="font-family: 宋体">LVDS 7 寸屏幕 </span></p>
<p><span style="font-family: 宋体">迅为</span> <span style="font-family: 宋体">LVDS 10.1 寸 1024*600 屏幕 </span></p>
<p><span style="font-family: 宋体">迅为</span> <span style="font-family: 宋体">LVDS 10.1 寸 1280*800 屏幕 </span></p>
<p><span style="font-family: 宋体">迅为</span> <span style="font-family: 宋体">LVDS 10.1 寸 1280*800 新屏幕 </span></p>
<p><span style="font-family: 宋体">然后修改</span> Android12 <span style="font-family: 宋体">源码</span> kernel-5.10/arch/arm64/boot/dts/rockchip/topeet_screen_lcds.dts <span style="font-family: 宋体">中</span></p>
<p><span style="font-family: 宋体">的设备树文件,如下图所示。</span> LVDS <span style="font-family: 宋体">屏幕是</span> MIPI 通过转接板连接显示的,RK3588 不支持LVDS 显示接口。</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142219274-1485367532.jpg"></p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">注:</span></p>
<p>其中#define LCD_TYPE_LVDS_10_1_1280X800_GT911 和#define</p>
<p>LCD_TYPE_LVDS_10_1_1280X800_GT9271 <span style="font-family: 宋体">不同之处在于屏幕背板,可通过如下进行区分:</span></p>
<p>#define LCD_TYPE_LVDS_10_1_1280X800_GT911</p>
<p>#define LCD_TYPE_LVDS_10_1_1280X800_GT9271</p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">我们可以根据自己的需求来修改</span> topeet_screen_choose.dtsi <span style="font-family: 宋体">文件。总之,修改</span></p>
<p>topeet_screen_choose.dtsi 的规律是:打开所连接的屏幕对应的宏定义,rk3588 <span style="font-family: 宋体">有三个显示通道</span> vp0 vp1 vp2 vp3<span style="font-family: 宋体">,所打开的宏定义对应的</span> vp <span style="font-family: 宋体">通道不能重复。默认打开对应的宏定义为多屏同显。</span></p>
<p>RK3588 VP 和各显示接口的连接关系如下图所示。</p>
<p> </p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142239476-2062968964.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>1.2 Android 多屏异显</p>
<p><span style="font-family: 宋体">如果要支持多屏异显,首先要调试好双屏或多屏都可以正常显示,并且分别挂载在不同的</span> vp <span style="font-family: 宋体">上,可以参考上一个小节根据自己的需求打开</span> topeet_screen_choose.dtsi <span style="font-family: 宋体">设备树中的宏定义。</span></p>
<p>默认开启后,多屏显示的是同一个画面(<span style="font-family: 宋体">如果要支持双屏或者多屏异显,需要应用支持异显,</span> <span style="font-family: 宋体">才会显示不同的内容</span>)<span style="font-family: 宋体">。查看当前的屏幕显示状态输入以下命令</span></p>
<p>cat /sys/kernel/debug/dri/0/summary</p>
<p><span style="font-family: 宋体">如果双屏或者多屏的显示器分辨率比例不同,比如说主屏是</span> 16:9<span style="font-family: 宋体">,副屏是</span> 4:3<span style="font-family: 宋体">,那么副</span> <span style="font-family: 宋体">屏显示的画面会拉伸或者缩小,原因是副屏的画面是主屏映射过去的,所以副屏上显示的是</span> <span style="font-family: 宋体">主屏的分辨率。如果同样的屏幕情况下,应用支持异显,那么副屏会显示实际正常的分辨率。</span></p>
<p><span style="font-family: 宋体">所以如果要支持双屏或者多屏同显并要求显示正常,双屏或者多屏的屏幕的分辨率比要一致。</span></p>
<p>1.2.1 指定主副屏</p>
<p><span style="font-family: 宋体">多屏异显的实际应用中,需要指定哪个是主屏,哪个是副屏。修改</span> Android12 <span style="font-family: 宋体">源码目录下</span> 3588-android12/device/rockchip/rk3588/rk3588_s/rk3588_s.mk <span style="font-family: 宋体">文件,添加如下内容:</span></p>
<p><span style="font-family: 宋体">如果要指定</span> MIPI 屏幕为主屏,HDMI <span style="font-family: 宋体">屏幕为副屏,如下设置:</span></p>
<p>PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI</p>
<p> </p>
<p> </p>
<p>PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A</p>
<p><span style="font-family: 宋体">如果要指定</span> MIPI 屏幕为主屏,EDP <span style="font-family: 宋体">屏幕为副屏,如下设置:</span></p>
<p> </p>
<p>PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI</p>
<p>PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=eDP</p>
<p><span style="font-family: 宋体">如果需要定义多个主副屏时,需要用逗号隔开,比如指定</span> MIPI eDP 为主屏,HDMI-A <span style="font-family: 宋体">为副屏,</span></p>
<p> </p>
<p><span style="font-family: 宋体">设置如下:</span></p>
<p>PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI,eDP</p>
<p>PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A</p>
<p> </p>
<p>1.2.2 异显方案介绍</p>
<p><span style="font-family: 宋体">目前有两种异显方案分别是</span> Android Presentation <span style="font-family: 宋体">和</span> Andorid Activity <span style="font-family: 宋体">指定屏幕启动</span> <span style="font-family: 宋体">。</span></p>
<p> </p>
<p>Android Presentation<span style="font-family: 宋体">,需要</span> APP <span style="font-family: 宋体">应用开发中调用相应接口使指定的</span> view (Presentation view <span style="font-family: 宋体">是一个特殊的</span> dialog <span style="font-family: 宋体">类型</span> view)<span style="font-family: 宋体">在副屏中显示。</span></p>
<p>Android Activity 指定屏幕启动,APP <span style="font-family: 宋体">在启动</span> activity <span style="font-family: 宋体">时可以使用</span> display id <span style="font-family: 宋体">参数在对应的屏幕上直接显示。</span></p>
<p> </p>
<p>两者主要区别在:</p>
<p>1 <span style="font-family: 宋体">前者的</span> acitivity 需要独立开发,把需要显示的内容投到副屏,后者可以不需要源码,调用命令行或者系统接口<span style="font-family: 宋体">把第三方</span> app <span style="font-family: 宋体">的</span> acitivity 投送到副屏;</p>
<p>2 .<span style="font-family: 宋体">前者只有一个</span> activity <span style="font-family: 宋体">在顶层,通过特殊的</span> dialog <span style="font-family: 宋体">将指定内容显示在副屏,后者是两个</span> activity <span style="font-family: 宋体">分别显示在主副屏。</span></p>
<p><span style="font-family: 宋体">接下来我们详细讲述这俩种方法。</span></p>
<p> </p>
<p>1.2.3 Android Presentation</p>
<p><span style="font-family: 宋体">本小节讲解</span> Android Presentation <span style="font-family: 宋体">异显方案,瑞芯微和迅为提供了使用</span> Android Presentation <span style="font-family: 宋体">编写好的</span> APP <span style="font-family: 宋体">例程,接下来进行测试。</span></p>
<p> </p>
<p>1.2.3.1 ApiDemos APP</p>
<p><span style="font-family: 宋体">在</span> Android12 <span style="font-family: 宋体">源码中瑞芯微已经提供了使用</span> Presentation <span style="font-family: 宋体">接口的测试</span> APP,在源码development/samples/ApiDemos <span style="font-family: 宋体">目录下,需要使用</span> mm <span style="font-family: 宋体">命令编译</span> APP<span style="font-family: 宋体">。迅为提供了编译好的</span> <span style="font-family: 宋体">测试</span> APP <span style="font-family: 宋体">在网盘资料</span><span style="font-family: 宋体">“</span>iTOP-RK3588 开发板/02_【iTOP-RK3588 开发板】/12_<span style="font-family: 宋体">多屏显示配套</span> <span style="font-family: 宋体">资料</span>/Android/ApiDemosAPK”目录下。</p>
<p><span style="font-family: 宋体">此</span> APP <span style="font-family: 宋体">源码在</span> Android <span style="font-family: 宋体">源码</span> 3588-android12/development/samples/ApiDemos <span style="font-family: 宋体">目录下,进入</span> <span style="font-family: 宋体">此目录,输入</span><span style="font-family: 宋体">“</span>mm”命令进行编译,如下图所示:</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142307739-1959878025.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">然后使用</span> adb <span style="font-family: 宋体">命令安装</span> APP<span style="font-family: 宋体">,依次点击</span> App->Activity->Presentation 选项,即可进入Presentation 调用界面。如下图所示:</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142315477-1396130021.jpg"></p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">在该界面需点击如下副屏的</span> checkbox 选项,<span style="font-family: 宋体">即可在副屏显示相应图片。副屏</span> HDMi 屏幕显示图片,</p>
<p> </p>
<p>1.2.3.2 Presentation sampleAPP</p>
<p><span style="font-family: 宋体">此</span> APP <span style="font-family: 宋体">在网盘资料</span><span style="font-family: 宋体">“</span>iTOP-RK3588 开发板/02_【iTOP-RK3588 开发板】/12_<span style="font-family: 宋体">多屏显示配</span> <span style="font-family: 宋体">套资料</span>/Android/Presentation sample”目录下,下载此 APP <span style="font-family: 宋体">工程,然后用</span> Androidstudio <span style="font-family: 宋体">打开,</span> <span style="font-family: 宋体">并编译</span> apk<span style="font-family: 宋体">。编译成功之后,安装</span> APP,APP 安装成功之后如下图所示:</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142326790-168883177.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">打开</span> APP 如下图所示:</p>
<p> </p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142336010-455938675.jpg"></p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">点击</span><span style="font-family: 宋体">“显示副屏”按钮,会在副屏显示,如下图所示:</span></p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142342923-1136716953.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>APP <span style="font-family: 宋体">重要知识点讲解:</span></p>
<p><span style="font-family: 宋体">随着用户的需求增多,特别是对于一些</span> Android <span style="font-family: 宋体">平板电脑以及其他的一些</span> Android 智能设备可能有多个屏幕,用户不仅想要在主屏幕上显示内容,同样在第二屏幕上也要显示想要的内容,这样可以达到更好的体验效果。Google <span style="font-family: 宋体">也是不负众望在</span> Android4.2 <span style="font-family: 宋体">版本以后提供了</span> Presentation 类,可以轻松实现在两块屏幕上同时显示不同的内容。Presentation <span style="font-family: 宋体">是一个特殊的</span> dialog<span style="font-family: 宋体">,它的目的是显示内容到第二屏幕。在</span> Presentation <span style="font-family: 宋体">创建的时候关联一个目标设备,确</span></p>
<p><span style="font-family: 宋体">定</span> Presentation <span style="font-family: 宋体">要显示在那个设备上,根据这个设备的信息来配置</span> Presentation <span style="font-family: 宋体">的</span> context <span style="font-family: 宋体">和</span> resources <span style="font-family: 宋体">信息。目前系统提供了两种方式来与目标显示屏进行绑定。</span></p>
<p>1 <span style="font-family: 宋体">通过</span> MediaRouter <span style="font-family: 宋体">接口获取并绑定:</span></p>
<p><span style="font-family: 宋体">选择显示</span> presentation <span style="font-family: 宋体">的设备最简单的方法就是使用</span> Media Router,media router <span style="font-family: 宋体">服务持续追踪在系统中哪个音频、视频线路是可用的,当</span> routes <span style="font-family: 宋体">被选择或者不被选择,或者更好的显示</span> presentation display <span style="font-family: 宋体">的线路发生改变后</span> media router <span style="font-family: 宋体">就会发送消息。所以一些应用程序可以自动监视这些消息来在首选设备上显示或取消</span> presentation<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">首选显示</span> presentation <span style="font-family: 宋体">的设备是</span> Media Router <span style="font-family: 宋体">进行推荐的,如果应用想要显示内容在第二</span> <span style="font-family: 宋体">屏幕上就该使用该设备。下面将给出如何使用</span> media router <span style="font-family: 宋体">在主屏的设备创建和显示</span></p>
<p>presentation<span style="font-family: 宋体">。</span></p>
<p>MediaRouter mediaRouter =(MediaRouter)</p>
<p>context.getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route =</p>
<p>mediaRouter.getSelectedRoute();</p>
<p>if(route !=null){</p>
<p>Display presentationDisplay = route.getPresentationDisplay();</p>
<p>if(presentationDisplay !=null){</p>
<p>Presentation presentation =newMyPresentation(context, presentationDisplay);</p>
<p>presentation.show();</p>
<p>}</p>
<p>}</p>
<p><span style="font-family: 宋体">根据上面代码可以看出通过系统服务</span> Media Router <span style="font-family: 宋体">来选择一个合适的</span> route<span style="font-family: 宋体">,从</span> route <span style="font-family: 宋体">中来获取首选的</span> display<span style="font-family: 宋体">,如果</span> display <span style="font-family: 宋体">不为空就会创建该</span> presentation<span style="font-family: 宋体">,创建完成后调用</span> presentation <span style="font-family: 宋体">的</span> show <span style="font-family: 宋体">方法将该</span> presentation <span style="font-family: 宋体">显示出来。</span></p>
<p>2 <span style="font-family: 宋体">通过</span> DisplayManager <span style="font-family: 宋体">接口获取并绑定</span></p>
<p><span style="font-family: 宋体">另外一个获取首选</span> display <span style="font-family: 宋体">的方法是直接使用</span> display Manager 来获取。display manager <span style="font-family: 宋体">服务提供方法枚举和描述系统中所有的设备,包括可以显示</span> presentation 的设备。display manager<span style="font-family: 宋体">持续追踪系统中所有的设备,然而,并不是所有的设备都适合显示</span> presentation<span style="font-family: 宋体">,例如,如果</span> <span style="font-family: 宋体">一个</span> Activity <span style="font-family: 宋体">试图在主屏幕上显示一个</span> presentation,它可能会掩盖自己的内容,这就像在Activity <span style="font-family: 宋体">上打开一个</span> dialog <span style="font-family: 宋体">一样。</span></p>
<p>DisplayManager displayManager =(DisplayManager)</p>
<p>context.getSystemService(Context.DISPLAY_SERVICE); Display[] presentationDisplays</p>
<p>=displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);</p>
<p>if(presentationDisplays.length >0){</p>
<p>// If there is more than one suitable presentation display, then we could consider</p>
<p>// giving the user a choice. For this example, we simply choose the first display</p>
<p>// which is the one the system recommends as the preferred presentation display.</p>
<p>Display display = presentationDisplays; // displays<span style="font-family: 宋体">是副屏</span></p>
<p>Presentation presentation =new MyPresentation(context, presentationDisplay);</p>
<p>presentation.show();</p>
<p>}</p>
<p><span style="font-family: 宋体">根据上面代码可以看出通过系统服务</span> Display Manager <span style="font-family: 宋体">来获取所有适合显示</span> presentation <span style="font-family: 宋体">的</span> display <span style="font-family: 宋体">列表,如果获取到了多个适合</span> display <span style="font-family: 宋体">对象,我们选择副屏的</span> display<span style="font-family: 宋体">。最后显示</span> presentation<span style="font-family: 宋体">。</span></p>
<p>1.2.4 Android Activity 指定屏幕启动</p>
<p><span style="font-family: 宋体">本小节讲解</span> Android Activity <span style="font-family: 宋体">指定屏幕启动异显方案,瑞芯微提供了使用</span> Android Activity <span style="font-family: 宋体">指定屏幕启动编写好的</span> APP <span style="font-family: 宋体">例程,接下来进行测试。</span></p>
<p>1.2.4.1 dualscreendemo APP</p>
<p>RK DualScreen <span style="font-family: 宋体">主要区别与</span> android presentation<span style="font-family: 宋体">,在于它实现了应用的派发,允许厂商快速根据现有的</span> app 功能,进行模块的集成,减少开发周期和研发成本。示例代码为DualScreenDemo.zip <span style="font-family: 宋体">工程,在网盘资料</span><span style="font-family: 宋体">“</span>iTOP-RK3588 开发板/02_【iTOP-RK3588 开发板】/12_ 多屏显示配套资料/Android/DualScreenDemo”目录下下载。</p>
<p><span style="font-family: 宋体">使用</span> Androidstudio <span style="font-family: 宋体">打开此工程代码,编译安装</span> APP,安装完成后如下所示:</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142406325-494113402.jpg"></p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">打开此</span> APP,如下所示,有三个按钮。</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142415448-833066419.jpg"></p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">第三个按钮使用了</span> Android Activity <span style="font-family: 宋体">指定屏幕启动,关键代码如下所示,第一个和第二个按钮使用了</span> Presentation<span style="font-family: 宋体">。</span></p>
<p>private void showSecondByActivity(Context context){</p>
<p>ActivityOptions options = ActivityOptions.makeBasic();</p>
<p>MediaRouter mediaRouter = (MediaRouter)</p>
<p>context.getSystemService(Context.MEDIA_ROUTER_SERVICE);</p>
<p>MediaRouter.RouteInfo route =</p>
<p>mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);</p>
<p>if (route != null) {</p>
<p>Display presentationDisplay = route.getPresentationDisplay();</p>
<p>options.setLaunchDisplayId(presentationDisplay.getDisplayId());</p>
<p>Intent intent = new Intent("android.intent.action.MUSIC_PLAYER");</p>
<p>intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);</p>
<p>startActivity(intent, options.toBundle());</p>
<p>}</p>
<p> </p>
<p>}</p>
<p><span style="font-family: 宋体">在</span> startActivity <span style="font-family: 宋体">接口参数中设置指定屏幕的</span> display id,Activity <span style="font-family: 宋体">将在指定屏幕上直接启动显示。</span></p>
<p>Activity 的多显示器支持需要设备支持<feature name="android.software.activities_on_secondary_displays" /><span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">同时</span> application <span style="font-family: 宋体">或者</span> activity 需要支持分屏属性即<application>或者<activity><span style="font-family: 宋体">标签下设</span> <span style="font-family: 宋体">置新的属性</span> android:resizeableActivity="true"<span style="font-family: 宋体">,这个属性在你</span> target <span style="font-family: 宋体">到</span> Android N <span style="font-family: 宋体">后</span> android:resizeableActivity <span style="font-family: 宋体">的默认值就是</span> true<span style="font-family: 宋体">。</span></p>
<p>ActivityOptions <span style="font-family: 宋体">提供两个新函数以支持多个显示器,分别是</span> setLaunchDisplayId()<span style="font-family: 宋体">和</span> getLaunchDisplayId()<span style="font-family: 宋体">。</span></p>
<p>setLaunchDisplayId() <span style="font-family: 宋体">指定</span> Activity <span style="font-family: 宋体">在启动后应显示在哪个显示器上。</span></p>
<p>getLaunchDisplayId() <span style="font-family: 宋体">返回操作组件的当前启动显示器。</span></p>
<p><span style="font-family: 宋体">在上述代码中使用</span> MediaRouter <span style="font-family: 宋体">接口获取副屏的</span> display id,<span style="font-family: 宋体">同理也可以使用</span></p>
<p>DisplayManager <span style="font-family: 宋体">接口获取响应的</span> display id。</p>
<p> </p>
<p>1.2.5 支持输入法在副屏显示</p>
<p><span style="font-family: 宋体">修改</span> Android12 <span style="font-family: 宋体">源码下的</span> device/rockchip/common/display_settings.xml 文件,如下所示:</p>
<p> <img src="https://img2024.cnblogs.com/blog/559586/202411/559586-20241105142428800-1179123647.jpg"></p>
<p> </p>
<p> </p>
<p><span style="font-family: 宋体">将设置相应屏幕</span> shouldShowIme <span style="font-family: 宋体">为</span> true,<span style="font-family: 宋体">如上配置支持输入法在</span> local:1 <span style="font-family: 宋体">的副屏上显示。</span></p>
<p> </p>
<p>1.2.6 副屏 DPI 设置</p>
<p><span style="font-family: 宋体">修改</span> Android12 <span style="font-family: 宋体">源码下的</span> device/rockchip/common/display_settings.xml 文件,</p>
<p><span style="font-family: 宋体">修改</span> forcedDensity 的值可以修改副屏的屏幕密度。</p>
<p> </p>
<p>1.2.7 主屏幕可以触摸,副屏不触摸</p>
<p><span style="font-family: 宋体">如果想要实现主屏可以触摸,副屏不用触摸的功能。有两种解决方式:第一种是在</span> App <span style="font-family: 宋体">应用代码中实现。第二种需要修改</span> framework <span style="font-family: 宋体">层的源码。</span></p>
<p><span style="font-family: 宋体">第一种方式:</span></p>
<p>getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,</p>
<p>WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);</p>
<p><span style="font-family: 宋体">第二种方式:</span></p>
<p><span style="font-family: 宋体">修改</span> Android12 <span style="font-family: 宋体">源码</span> frameworks/native/services/inputflinger/reader/EventHub.cpp <span style="font-family: 宋体">文件,屏蔽掉</span> device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;属性,</p>
<p> </p>
<p>1.2.8 多屏异触</p>
<p><span style="font-family: 宋体">多屏异触需要指定主副屏。这里使用修改</span> Android <span style="font-family: 宋体">源码的方式实现绑定副屏触摸芯片。这样设置以后,系统开机会自动将</span> ft5x06 <span style="font-family: 宋体">触摸绑定到副屏上面去。修改文件:</span></p>
<p>frameworks/native/services/inputflinger/reader/EventHub.cpp,添加如下加红的代码。通过修改EventHub.cpp <span style="font-family: 宋体">文件,在</span> isExternalDeviceLocked <span style="font-family: 宋体">函数中判断设备名称为指定的副屏设备(比如副屏的设备名称是</span> generic ft5x06 (79)<span style="font-family: 宋体">),则返回</span> true<span style="font-family: 宋体">。</span></p>
<p>bool EventHub::isExternalDeviceLocked(Device* device) {</p>
<p>const char *I2C_DEVICE_NAME = "generic ft5x06 (79)";</p>
<p>ALOGE("input deviceis '%s' ",device->identifier.name.c_str());</p>
<p>if (strcmp(device->identifier.name.c_str(), I2C_DEVICE_NAME) == 0) {</p>
<p>return true;</p>
<p>}</p>
<p>if (device->configuration) {</p>
<p>bool value;</p>
<p>if (device->configuration->tryGetProperty(String8("device.internal"), value)) {</p>
<p>return !value;</p>
<p>}</p>
<p>}</p>
<p>return device->identifier.bus == BUS_USB || device->identifier.bus ==</p>
<p>BUS_BLUETOOTH;</p>
<p>}</p>
<p><span style="font-family: 宋体">这里的</span> I2C_DEVICE_NAME <span style="font-family: 宋体">需要根据实际情况添加,用户可根据</span> ALOGE 打印信息在logcat <span style="font-family: 宋体">中寻找识别到的芯片实际的名字。下面是添加了</span> ALOGE <span style="font-family: 宋体">打印信息后在</span> logcat 中得到的设备名字的截图:</p>
<p><span style="font-family: 宋体">上图中的</span> goodix-ts <span style="font-family: 宋体">和</span> generic ft5x06 (79)<span style="font-family: 宋体">即为这里使用的触摸</span> IC <span style="font-family: 宋体">芯片的名字,将这个复制</span> <span style="font-family: 宋体">到代码中即可。修改完毕,重新编译</span>Android镜像,用户测试的时候可以直接使用ApiDemo APP <span style="font-family: 宋体">进行测试。</span></p>
<p> </p>
<p>1.2.9 鼠标异屏切换</p>
<p><span style="font-family: 宋体">在多屏异显情况下,修改以下代码使鼠标箭头可以移动到需要的副屏上去进行操作。</span></p>
<p><span style="font-family: 宋体">我们需要修改</span> Android12 <span style="font-family: 宋体">源码中</span></p>
<p>frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp <span style="font-family: 宋体">文件</span></p>
<p>搜索"sys.mouse.presentation"<span style="font-family: 宋体">,然后将下面的代码中</span> 0 <span style="font-family: 宋体">改为</span> 1。</p>
<p>char mMousePresentation = {1};</p>
<p>property_get("sys.mouse.presentation", mMousePresentation, "1");</p>
<p>if (strcmp(mMousePresentation, "1") == 0) {</p>
<p>displayId = mDisplayId;</p>
<p>float minX, minY, maxX, maxY;</p>
<p>if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)) {</p>
<p>if(xCursorPosition==minX||xCursorPosition==maxX||yCursorPosition==minY||yCursorPosition==</p>
<p>maxY){</p>
<p>displayId=getPolicy()->notifyDisplayIdChanged();</p>
<p>mDisplayId=displayId;</p>
<p>}</p>
<p>}</p>
<p>}else{</p>
<p>displayId = mPointerController->getDisplayId();</p>
<p>}</p>
<p><span style="font-family: 宋体">然后重新编译</span> Android 源码,然后烧写镜像。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/topeet/p/18527785
頁:
[1]