一.技术的背景

随着电梯广告传媒行业的飞速发展,双屏广告机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化。基于市场的需求,研发出了基于rk3288平台的双屏异显广告机。

二.技术方案的具体实现

1.硬件层面的实现原理

RK3188 PX3 RK3288 RK3399 的 SOC 内部,都有集成两个 LCDC 控制器,因此这就给双

屏异显功能的实现提供了基础。那么软件上的实现就是通过开辟两块不同的 buffer,对应外部的

物理屏幕。然后每块 buffer,通过不同 LCDC 送给对应的屏幕,即实现了双屏异显的功能。所以

这也是为什么必须有两块 LCDC 的 SOC 才能去做双屏异显功能的原因。

我司采用的rk3288平台就有2个LCD控制器,可以外接两个屏幕。我司采用的方案是,LCDC0接LVDS接口的屏幕(18.5寸的主屏),LCDC1接EDP接口的屏幕(10.1寸的副屏)。硬件逻辑图如下所示:

2.底层软件层面的实现原理

默认情况下,我司rk3288芯片上跑的Android 6.0系统只能通过LCD0控制器输出图像给一个屏幕显示。要支持同时通过LCDC0和LCDC1输出图像给两个屏幕显示,必须修改代码。经过分析软件实现的原理图如下:

下面是对上面原理图的解析:

a.保证两个屏幕单独作为主屏的时候都可以正常显示,这样子保证了两个屏幕的屏参都是正确的,而且两个屏幕的物理连接都正常。

开始调试两个屏幕同时显示

b.双屏显示控制部分的实现:默认情况下rk_screen.c驱动代码里只会去解析dts里主屏的屏参,在里面加入代码使得根据id同时去解析副屏的屏参。然后LCDC0的驱动rk32_lvds.c以及LCDC1的驱动rk32_dp.c同时去获取屏幕的相关参数(读取刚才rk_screen.c里配置的相关结构体)。这样子两个屏幕的LCD控制器部分的驱动都完善了。

c.双屏显示数据部分的实现:已知android系统抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由FrameBuffer设备驱动来完成的。

rk系统里面framebuffer的驱动为rk_fb.c。主屏为/dev/graphics/fb0,副屏为/dev/graphics/fb4,上层通过打开这两个节点返回文件描述符,通过文件描述符写入两个屏幕的数据,然后DMA,把缓冲区里的数据传给屏幕。默认情况下rk_fb.c只会去分配一块缓冲区给主屏用,需要修改代码,根据副屏的屏参分配缓冲区给副屏用,大小为长*宽*每个像素的位数。

3.在底层实现双屏同显的基础上,APP中去实现双屏异显

通过前面底层的修改,已经实现了双屏可以同时输出相同的内容。为了支持两个屏幕实现不同的内容,可以在APP中操作。

Android 的标准实现是使用 API Presentation 来实现异显的功能。 Presentation 是扩展自 dialog.

Presentation 是 Android 针对双屏异显所开发的一个类。它可以做到一个 APK 里面,通过给Presentation 单独进行 view 的布局,来实现同一个 APK 在主屏和副屏上面显示不同的 view,来达到异显的效果。它的工作原理是通过调用 DisplayManagerService 的 getDisplays 方法来获取第二个显示设备。将第二个显示设备作为参数传给 Presentation,然后在 Presentation 里面实现自己的 UI内容,最终调用 Presentation 的 show 方法来将 UI 内容显示在第二个显示设备上面。下面是我写的一个简单的 Demo。

public class MainActivity extends Activity

{ private DemoPresentation mPresentation;

private Display[] displays;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

DisplayManager mDisplayManager = (DisplayManager)

getSystemService(Context.DISPLAY_SERVICE);

displays = mDisplayManager.getDisplays();

mPresentation = new DemoPresentation(MainActivity.this, displays[1]);

Button Button1=(Button) findViewById(R.id.button1);

Button1.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v)

{

//这里进行副屏显示的调用

mPresentation.show();

}

});

}

public class DemoPresentation extends Presentation {

//private PresentationContents mContents;

public DemoPresentation(Context outerContext, Display display) {

super(outerContext, display);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Resources r=getContext().getResources();//根据 prsentation 的上下文获取到资源文件

setContentView(R.layout.main2);

Button Button2=(Button) findViewById(R.id.button2);

videoView1 = (VideoView) findViewById(R.id.videoView1);

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

File file = Environment.getExternalStorageDirectory();

File videoFile = new File(file, "testvideo.mp4");

if (videoFile.exists()) {

uri = Uri.fromFile(videoFile);

videoView1.setVideoURI(uri);

VideoView1.setMediaController(controller);

videoView1.requestFocus();

playVideo();

}

}

}

这个 Demo 最终实现的是同一个 APK,主屏显示一些如 button 等的 view,然后副屏可以显示一个SurfaceView,及播放一个视频。

作者:妄念和涤生
链接:https://www.jianshu.com/p/01534039693f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【转载】Android 双屏异显方案相关推荐

  1. android双屏异显获取副屏参数,Android 双屏 异显 插件 双屏(副屏)异显,主副屏通讯...

    更新记录 1.2.0(2021-04-12) 优化副屏视频播放功能. 1.1.0(2020-07-01) 新增,视频列表播放,可以在副屏播放一些广告视频等等. 查看更多 平台兼容性 Android i ...

  2. Android 双屏异显(Presentation) 开发,将第二个页面投屏到副屏上

    1. 背景 最近开发的一个项目,有两个屏幕,需要将第二个页面投屏到副屏上, 这就需要用到Android的双屏异显(Presentation)技术了,研究了一下,这里做下笔记. 我们那个副屏是一块汽车的 ...

  3. 【Android双屏异显】如何真正的实现Android双屏异显

    最近在做一个Android双屏异显的项目,要实现一台Android设备通过HDMI连接两个显示器,然后在一个App中同时显示两个不同的画面. 标题实际上Android并不存在真正的像Windows一样 ...

  4. Android双屏异显的实现

    概述 Android实现双屏异显的实现方式有2种. 方式一:在Android4.2及以上平台上,按照标准Android SDK提供的API,使用Presentation类,将一个APP的相关内容显示到 ...

  5. Android双屏异显

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.设置Simulate secondary displays 二.实现副屏异显 三.实现效果 Andr ...

  6. Android双屏异显另辟蹊径---minui的移植

    minui介绍 minui是Android自带的一个画图工具,可以绘制一些简单的图形和图像,显示png图片,显示字符串等. 在Android设备中譬如,关机充电动画,自动测试程序,recovery模式 ...

  7. Android 双屏异显(兼容android8)

    1.双屏判断(是否支持双屏异显) 2.权限申请(android 6 以后需要申请权限) 3.客显实例化 (客显布局) public void initDiffDisplay() {try {Displ ...

  8. Android 双屏异显

    背景: 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看.这里就涉及到 Android 的双屏异显的问 ...

  9. android 分屏投影,Android 双屏异显实现的三种方式

    在各种产品脑洞大开的时代,需求也是日益新异,笔者最近开发了一套双屏异显app.现在做一些总结 1.双屏异显第一种实现方式(官方提供的Presentation) Android 提供了一个叫 Prese ...

最新文章

  1. 各浏览器对document.getElementById等方法的实现差异
  2. matlab 连续显示,请教下MATLAB一个问题啊 我想检测一行数据里面出现连续出现0的次数,...
  3. C#创建https请求并使用pfx证书
  4. 反病毒引擎设计全解(二)
  5. UE4笔记-进程/线程/网络/IO模块的相关问题记录
  6. SLF4JLoggerContext cannot be cast to LoggerContext
  7. 鸿蒙构架谁提供的,科普丨关于“鸿蒙”,不知道这些你都不好意思跟别人打招呼!...
  8. IIS配置教程。。。。。
  9. zabbix邮件内容乱码与邮件内容为附件解决办法
  10. Oracle 11g 使用RMAN备份数据库
  11. 索引大小对语句执行速度的影响
  12. F12开发者工具自带取色器
  13. 浅谈软件工程学习心得
  14. 基于 Roslyn 实现代码动态编译
  15. VMare虚拟机无法识别USBkey问题
  16. 计算机模拟计算 电脑配置,Material Studio材料模拟计算的工作站配置方案
  17. [转载]jbx 乱码问题的解决大全
  18. AM335x Linux调试1--MLO中打印寄存器值
  19. JAVA设计模式笔记(简单工厂模式)
  20. dotnet 基于 debian 创建一个 docker 的 sdk 镜像

热门文章

  1. java美颜算法_java实现各种算法
  2. Linux快捷键、终端常用指令(最新版Ubuntu20.04)
  3. 使用matplotlib绘制散点图、条形图、直方图
  4. win 8 store app 免费中通快递查询 隐私声明
  5. 佳士得将举行火星、月球和其他稀有陨石线上拍卖会
  6. arduino安装esp8266库
  7. 基于FreeCAD的dxf转机械手代码的一种实现方法
  8. spring-kafka 实战
  9. JSP JavaBean Servlet 的介绍(转)
  10. 随机抽奖程序_某个知乎想法抽奖程序随机更新。jpg