好好先生丶 發表於 2025-1-16 17:03:00

迅为RK3576开发板Android 多屏显示

<p><span style="font-family: 宋体">&nbsp;</span></p>
<p><span style="font-family: 宋体">迅为</span><span style="font-family: Calibri">iTOP-3576</span><span style="font-family: 宋体">开发板采用瑞芯微</span><span style="font-family: Calibri">RK3576</span><span style="font-family: 宋体">高性能、低功耗的应用处理芯片,集成了</span><span style="font-family: Calibri">4</span><span style="font-family: 宋体">个</span><span style="font-family: Calibri">Cortex-A72</span><span style="font-family: 宋体">和</span><span style="font-family: Calibri">4</span><span style="font-family: 宋体">个</span><span style="font-family: Calibri">Cortex-A53</span><span style="font-family: 宋体">核心,以及独立的</span><span style="font-family: Calibri">NEON</span><span style="font-family: 宋体">协处理器。它适用于</span><span style="font-family: Calibri">ARM PC</span><span style="font-family: 宋体">、边缘计算、个人移动互联网设备及其他多媒体产品。</span></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170036711-144944360.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1.1 Android 多屏同显</p>
<p>iTOP-RK3576 <span style="font-family: 宋体">开发板支持以下屏幕</span></p>
<p><span style="font-family: 宋体">迅为</span> <span style="font-family: 宋体">MIPI 7 寸屏幕 </span></p>
<p><span style="font-family: 宋体">标准</span> <span style="font-family: 宋体">HDMI 屏幕(通过 HDMI 线连接) </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> Android <span style="font-family: 宋体">源码</span> kernel-6.1/arch/arm64/boot/dts/rockchip/topeet-screen-lcds.dtsi <span style="font-family: 宋体">中的</span></p>
<p>设备树文件,如下图所示。LVDS <span style="font-family: 宋体">屏幕是</span> MIPI 通过转接板连接显示的,RK3576 <span style="font-family: 宋体">不支持</span> LVDS</p>
<p>显示接口。</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170045965-1445631073.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">我们可以根据自己的需求来修改</span> topeet-screen-lcds.dtsi <span style="font-family: 宋体">文件。总之,修改</span></p>
<p>topeet_screen_choose.dtsi 的规律是:打开所连接的屏幕对应的宏定义,rk3576 <span style="font-family: 宋体">有三个显示通</span></p>
<p><span style="font-family: 宋体">道</span> vp0 vp1 vp2<span style="font-family: 宋体">,所打开的宏定义对应的</span> vp 通道不能重复<span style="font-family: 宋体">。默认打开对应的宏定义为多屏同显。</span></p>
<p>如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT9271, <span style="font-family: 宋体">需要将</span></p>
<p>kernel-6.1/arch/arm64/configs/rockchip_defconfig <span style="font-family: 宋体">文件中的</span></p>
<p>CONFIG_TOUCHSCREEN_GT9271=y <span style="font-family: 宋体">宏定义使能,然后再编译源码。</span></p>
<p>如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1024x600_GT911,<span style="font-family: 宋体">需要将</span></p>
<p>kernel-6.1/arch/arm64/configs/rockchip_defconfig <span style="font-family: 宋体">文件中的</span> CONFIG_TOUCHSCREEN_GT9XX</p>
<p><span style="font-family: 宋体">宏定义使能,然后再编译源码。</span></p>
<p>1.2 Android 多屏异显</p>
<p><span style="font-family: 宋体">如果要支持多屏异显,首先要调试好双屏或多屏都可以正常显示,并且分别挂载在不同的</span></p>
<p>vp <span style="font-family: 宋体">上,可以参考上一个小节根据自己的需求打开</span> topeet-screen-lcds.dtsi <span style="font-family: 宋体">设备树中的宏定义。默</span></p>
<p>认开启后,多屏显示的是同一个画面(如果要支持双屏或者多屏异显,需要应用支持异显,才会显示不同的内容)<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></p>
<p><span style="font-family: 宋体">屏显示的画面会拉伸或者缩小,原因是副屏的画面是主屏映射过去的,所以副屏上显示的是</span></p>
<p><span style="font-family: 宋体">主屏的分辨率。如果同样的屏幕情况下,应用支持异显,那么副屏会显示实际正常的分辨率。</span></p>
<p><span style="font-family: 宋体">所以如果要支持双屏或者多屏同显并要求显示正常,双屏或者多屏的屏幕的分辨率比要一致。</span></p>
<p>1.2.1 指定主副屏</p>
<p><span style="font-family: 宋体">多屏异显的实际应用中,需要指定哪个是主屏,哪个是副屏。修改</span> Android14 <span style="font-family: 宋体">源码目录下</span></p>
<p>rk3576_android14/device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.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>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>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><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>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>Android Presentation<span style="font-family: 宋体">,需要</span> APP <span style="font-family: 宋体">应用开发中调用相应接口使指定的</span> view (Presentation</p>
<p>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><span style="font-family: 宋体">的屏幕上直接显示。</span></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></p>
<p><span style="font-family: 宋体">个</span> activity <span style="font-family: 宋体">分别显示在主副屏。</span></p>
<p><span style="font-family: 宋体">接下来我们详细讲述这俩种方法。</span></p>
<p>1.2.3 Android Presentation</p>
<p><span style="font-family: 宋体">本小节讲解</span> Android Presentation <span style="font-family: 宋体">异显方案,瑞芯微和迅为提供了使用</span> Android Presentation</p>
<p><span style="font-family: 宋体">编写好的</span> APP <span style="font-family: 宋体">例程,接下来进行测试。</span></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<span style="font-family: 宋体">,在源码</span></p>
<p>development/samples/ApiDemos <span style="font-family: 宋体">目录下,需要使用</span> mm <span style="font-family: 宋体">命令编译</span> APP<span style="font-family: 宋体">。迅为提供了编译好的</span></p>
<p><span style="font-family: 宋体">测试</span> APP <span style="font-family: 宋体">在网盘资料</span><span style="font-family: 宋体">“</span>iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_<span style="font-family: 宋体">多屏显示配套</span></p>
<p>资料/Android/ApiDemosAPK”目录下。</p>
<p><span style="font-family: 宋体">此</span> APP <span style="font-family: 宋体">源码在</span> Android <span style="font-family: 宋体">源码</span> rk3576_android14/development/samples/ApiDemos <span style="font-family: 宋体">目录下,进</span></p>
<p><span style="font-family: 宋体">入此目录,输入</span><span style="font-family: 宋体">“</span>mm”命令进行编译,如下图所示:</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170108039-1001482555.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">然后使用</span> adb <span style="font-family: 宋体">命令安装</span> APP<span style="font-family: 宋体">,依次点击</span> App-&gt;Activity-&gt;Presentation <span style="font-family: 宋体">选项,即可进入</span></p>
<p>Presentation 调用界面。如下图所示:</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170115208-240767889.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">在该界面需点击如下副屏的</span> checkbox 选项,即可在副屏显示相应图片。如下所示:</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170123836-1581746698.jpg"></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">副屏</span> HDMi 屏幕显示图片,如下所示:</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170130490-2004355591.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</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-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_<span style="font-family: 宋体">多屏显示配</span></p>
<p>套资料/Android/Presentation-sample”目录下,下载此 APP <span style="font-family: 宋体">工程,然后用</span> Androidstudio <span style="font-family: 宋体">打开,</span></p>
<p><span style="font-family: 宋体">并编译</span> apk<span style="font-family: 宋体">。编译成功之后,安装</span> APP,APP 安装成功之后如下图所示:</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170138006-1299765575.jpg"></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">打开</span> APP 如下图所示:</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170247980-865741181.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">点击</span><span style="font-family: 宋体">“显示副屏”按钮,会在副屏显示,如下图所示:</span></p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170256627-403793086.jpg"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>APP <span style="font-family: 宋体">重要知识点讲解:</span></p>
<p><span style="font-family: 宋体">随着用户的需求增多,特别是对于一些</span> Android <span style="font-family: 宋体">平板电脑以及其他的一些</span> Android <span style="font-family: 宋体">智能设</span></p>
<p><span style="font-family: 宋体">备可能有多个屏幕,用户不仅想要在主屏幕上显示内容,同样在第二屏幕上也要显示想要的</span></p>
<p>内容,这样可以达到更好的体验效果。Google <span style="font-family: 宋体">也是不负众望在</span> Android4.2 版本以后提供了</p>
<p>Presentation 类,可以轻松实现在两块屏幕上同时显示不同的内容。Presentation <span style="font-family: 宋体">是一个特殊的</span></p>
<p>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></p>
<p>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></p>
<p><span style="font-family: 宋体">追踪在系统中哪个音频、视频线路是可用的,当</span> routes <span style="font-family: 宋体">被选择或者不被选择,或者更好的显</span></p>
<p><span style="font-family: 宋体">示</span> presentation display <span style="font-family: 宋体">的线路发生改变后</span> media router <span style="font-family: 宋体">就会发送消息。所以一些应用程序可以</span></p>
<p><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></p>
<p><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></p>
<p><span style="font-family: 宋体">获取首选的</span> display<span style="font-family: 宋体">,如果</span> display <span style="font-family: 宋体">不为空就会创建该</span> presentation<span style="font-family: 宋体">,创建完成后调用</span> presentation</p>
<p><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></p>
<p><span style="font-family: 宋体">务提供方法枚举和描述系统中所有的设备,包括可以显示</span> presentation 的设备。display manager</p>
<p><span style="font-family: 宋体">持续追踪系统中所有的设备,然而,并不是所有的设备都适合显示</span> presentation,例如,如果</p>
<p><span style="font-family: 宋体">一个</span> Activity <span style="font-family: 宋体">试图在主屏幕上显示一个</span> presentation<span style="font-family: 宋体">,它可能会掩盖自己的内容,这就像在</span></p>
<p>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 &gt;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></p>
<p>display <span style="font-family: 宋体">列表,如果获取到了多个适合</span> display <span style="font-family: 宋体">对象,我们选择副屏的</span> display<span style="font-family: 宋体">。最后显示</span></p>
<p>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</p>
<p><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></p>
<p><span style="font-family: 宋体">速根据现有的</span> app <span style="font-family: 宋体">功能,进行模块的集成,减少开发周期和研发成本。示例代码为</span></p>
<p>DualScreenDemo.zip <span style="font-family: 宋体">工程,在网盘资料</span><span style="font-family: 宋体">“</span>iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_</p>
<p>多屏显示配套资料/Android/DualScreenDemo”目录下下载。</p>
<p><span style="font-family: 宋体">使用</span> Androidstudio <span style="font-family: 宋体">打开此工程代码,编译安装</span> APP,安装完成后如下所示:</p>
<p><span style="font-family: 宋体">打开此</span> APP,如下所示,有三个按钮。</p>
<p><span style="font-family: 宋体">第三个按钮使用了</span> Android Activity <span style="font-family: 宋体">指定屏幕启动,关键代码如下所示,第一个和第二个</span></p>
<p><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><span style="font-family: 宋体">在</span> startActivity <span style="font-family: 宋体">接口参数中设置指定屏幕的</span> display id,Activity <span style="font-family: 宋体">将在指定屏幕上直接启</span></p>
<p><span style="font-family: 宋体">动显示。</span></p>
<p>Activity 的多显示器支持需要设备支持&lt;feature</p>
<p>name="android.software.activities_on_secondary_displays" /&gt;<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">同时</span> application <span style="font-family: 宋体">或者</span> activity 需要支持分屏属性即&lt;application&gt;或者&lt;activity&gt;<span style="font-family: 宋体">标签下设</span></p>
<p><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></p>
<p>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></p>
<p>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>1.2.5 支持输入法在副屏显示</p>
<p><span style="font-family: 宋体">修改</span> Android14 <span style="font-family: 宋体">源码下的</span> device/rockchip/common/display_settings.xml <span style="font-family: 宋体">文件,如下所示:</span></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>1.2.6 副屏 DPI 设置</p>
<p><span style="font-family: 宋体">修改</span> Android14 <span style="font-family: 宋体">源码下的</span> device/rockchip/common/display_settings.xml <span style="font-family: 宋体">文件,如下所示:</span></p>
<p><span style="font-family: 宋体">修改</span> forcedDensity 的值可以修改副屏的屏幕密度。</p>
<p>1.2.7 主屏幕可以触摸,副屏不触摸</p>
<p><span style="font-family: 宋体">如果想要实现主屏可以触摸,副屏不用触摸的功能。有两种解决方式:第一种是在</span> App</p>
<p><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> Android14 <span style="font-family: 宋体">源码</span> frameworks/native/services/inputflinger/reader/EventHub.cpp <span style="font-family: 宋体">文件,屏蔽掉</span> device-&gt;classes |= InputDeviceClass::EXTERNAL;属性,如下图所示:</p>
<p>1.2.8 多屏异触</p>
<p><span style="font-family: 宋体">多屏异触需要指定主副屏。这里使用修改</span> Android <span style="font-family: 宋体">源码的方式实现绑定副屏触摸芯片。这</span></p>
<p><span style="font-family: 宋体">样设置以后,系统开机会自动将</span> ft5x06 <span style="font-family: 宋体">触摸绑定到副屏上面去。修改文件:</span></p>
<p>frameworks/native/services/inputflinger/reader/EventHub.cpp<span style="font-family: 宋体">,添加如下加红的代码。通过修改</span></p>
<p>EventHub.cpp <span style="font-family: 宋体">文件,在</span> isExternalDeviceLocked <span style="font-family: 宋体">函数中判断设备名称为指定的副屏设备(比如</span></p>
<p><span style="font-family: 宋体">副屏的设备名称是</span> generic ft5x06 (79)<span style="font-family: 宋体">),则返回</span> true<span style="font-family: 宋体">。</span></p>
<p>bool EventHub::Device::isExternalDeviceLocked() {</p>
<p>const char *I2C_DEVICE_NAME = "generic ft5x06 (79)";</p>
<p>ALOGE("input deviceis '%s' ",device-&gt;identifier.name.c_str());</p>
<p>if (strcmp(device-&gt;identifier.name.c_str(), I2C_DEVICE_NAME) == 0) {</p>
<p>return true;</p>
<p>}</p>
<p>if (configuration) {</p>
<p>std::optional&lt;bool&gt; isInternal = configuration-&gt;getBool("device.internal");</p>
<p>if (isInternal.has_value()) {</p>
<p>return !isInternal.value();</p>
<p>}</p>
<p>}</p>
<p>return identifier.bus == BUS_USB || identifier.bus == BUS_BLUETOOTH;</p>
<p>}</p>
<p><span style="font-family: 宋体">这里的</span> I2C_DEVICE_NAME <span style="font-family: 宋体">需要根据实际情况添加,用户可根据</span> ALOGE <span style="font-family: 宋体">打印信息在</span></p>
<p>logcat <span style="font-family: 宋体">中寻找识别到的芯片实际的名字。下面是添加了</span> ALOGE <span style="font-family: 宋体">打印信息后在</span> logcat <span style="font-family: 宋体">中得到的</span></p>
<p>设备名字的截图:</p>
<p>&nbsp;</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></p>
<p>到代码中即可。修改完毕,重新编译Android镜像,用户测试的时候可以直接使用ApiDemo APP</p>
<p>进行测试。</p>
<p>1.2.9 鼠标异屏切换</p>
<p><span style="font-family: 宋体">在多屏异显情况下,修改以下代码使鼠标箭头可以移动到需要的副屏上去进行操作。</span></p>
<p><span style="font-family: 宋体">我们需要修改</span> Android14 <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<span style="font-family: 宋体">。</span></p>
<p>//-----rk-code----</p>
<p>char mMousePresentation = {1};</p>
<p>property_get("sys.mouse.presentation", mMousePresentation, "1");</p>
<p>if (strcmp(mMousePresentation, "1") == 0) {</p>
<p>if (std::optional&lt;FloatRect&gt; rect = mPointerController-&gt;getBounds();</p>
<p>rect.has_value()) {</p>
<p>if(xCursorPosition==rect-&gt;left||xCursorPosition==rect-&gt;right||yCursorPosition==rect-&gt;top||yCursor</p>
<p>Position==rect-&gt;bottom){</p>
<p>mDisplayId=getPolicy()-&gt;notifyDisplayIdChanged();</p>
<p>}</p>
<p>}</p>
<p>}else{</p>
<p>mDisplayId = mPointerController-&gt;getDisplayId();</p>
<p>}</p>
<p><span style="font-family: 宋体">然后重新编译</span> Android 源码,然后烧写镜像。<br>1.2.10 副屏显示配置 </p>
<p>1.2.10.1 副屏全屏显示 </p>
<p><span style="font-family: 宋体">设置副屏(副屏</span> 1<span style="font-family: 宋体">、副屏</span> 2 <span style="font-family: 宋体">等)是否全屏显示可通过修改</span> persist.sys.rotation.efull-n(n=1<span style="font-family: 宋体">、</span> </p>
<p>2、3<span style="font-family: 宋体">、</span><span style="font-family: 宋体">…</span>.<span style="font-family: 宋体">)参数的取值进行配置,若配置为</span> true <span style="font-family: 宋体">则会进行全屏显示。</span> </p>
<p><span style="font-family: 宋体">现以</span> MIPI <span style="font-family: 宋体">主屏、</span> HDMI <span style="font-family: 宋体">副</span> <span style="font-family: 宋体">屏</span> <span style="font-family: 宋体">为</span> <span style="font-family: 宋体">例</span> <span style="font-family: 宋体">,修改如下:</span> </p>
<p><span style="font-family: 宋体">在</span> device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk <span style="font-family: 宋体">文件中添加如下内容,使得</span> </p>
<p>HDMI <span style="font-family: 宋体">副屏可以全屏显示(由于副屏图像参考主屏宽高比进行缩放,若宽高比不一致,则出</span> </p>
<p><span style="font-family: 宋体">现黑边,所以默认</span> HDMI <span style="font-family: 宋体">副屏显示会有黑边):</span> </p>
<p>PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=true </p>
<p><span style="font-family: 宋体">修改完成后,保存退出,重新编译烧写镜像即可。</span> </p>
<p><span style="font-family: 宋体">注:由于</span> mipi <span style="font-family: 宋体">竖屏显示与</span> HDMI 宽高比相差较大,HDMI <span style="font-family: 宋体">设置全屏显示后拉伸较明显!</span> </p>
<p>1.2.10.2 副屏显示方向 </p>
<p><span style="font-family: 宋体">副屏的旋转角度可通过</span> persist.sys.rotation.einit-n(n=1、2、3、….<span style="font-family: 宋体">)属性控制,该属性用</span> </p>
<p><span style="font-family: 宋体">于设置副屏(副屏</span> 1<span style="font-family: 宋体">、副屏</span> 2 <span style="font-family: 宋体">等)的显示方向,可取值为</span> 0/1/2/3<span style="font-family: 宋体">,分别表示将副屏显示方</span> </p>
<p>向旋转(顺时针)0 度、90 度、180 度、270 <span style="font-family: 宋体">度。</span> </p>
<p><span style="font-family: 宋体">现以</span> MIPI <span style="font-family: 宋体">主屏、</span> HDMI <span style="font-family: 宋体">副</span> <span style="font-family: 宋体">屏</span> <span style="font-family: 宋体">为</span> <span style="font-family: 宋体">例</span> <span style="font-family: 宋体">,修改如下:</span> </p>
<p><span style="font-family: 宋体">在</span> device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk <span style="font-family: 宋体">文件中添加如下内容,使得</span> </p>
<p>HDMI <span style="font-family: 宋体">副屏的显示方向旋转</span> 90 <span style="font-family: 宋体">度:</span> </p>
<p>PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.einit-1=1 </p>
<p>PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=false</p>
<p>&nbsp;<img src="https://img2024.cnblogs.com/blog/559586/202501/559586-20250116170322971-30847939.jpg"></p>
<p>&nbsp;</p>
<p>修改完成后,保存退出,重新编译烧写镜像即可,HDMI <span style="font-family: 宋体">会旋转</span> 90°竖屏显示。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/topeet/p/18675360
頁: [1]
查看完整版本: 迅为RK3576开发板Android 多屏显示