【转载】Android 双屏异显方案
一.技术的背景
随着电梯广告传媒行业的飞速发展,双屏广告机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化。基于市场的需求,研发出了基于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 双屏异显方案相关推荐
- android双屏异显获取副屏参数,Android 双屏 异显 插件 双屏(副屏)异显,主副屏通讯...
更新记录 1.2.0(2021-04-12) 优化副屏视频播放功能. 1.1.0(2020-07-01) 新增,视频列表播放,可以在副屏播放一些广告视频等等. 查看更多 平台兼容性 Android i ...
- Android 双屏异显(Presentation) 开发,将第二个页面投屏到副屏上
1. 背景 最近开发的一个项目,有两个屏幕,需要将第二个页面投屏到副屏上, 这就需要用到Android的双屏异显(Presentation)技术了,研究了一下,这里做下笔记. 我们那个副屏是一块汽车的 ...
- 【Android双屏异显】如何真正的实现Android双屏异显
最近在做一个Android双屏异显的项目,要实现一台Android设备通过HDMI连接两个显示器,然后在一个App中同时显示两个不同的画面. 标题实际上Android并不存在真正的像Windows一样 ...
- Android双屏异显的实现
概述 Android实现双屏异显的实现方式有2种. 方式一:在Android4.2及以上平台上,按照标准Android SDK提供的API,使用Presentation类,将一个APP的相关内容显示到 ...
- Android双屏异显
和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.设置Simulate secondary displays 二.实现副屏异显 三.实现效果 Andr ...
- Android双屏异显另辟蹊径---minui的移植
minui介绍 minui是Android自带的一个画图工具,可以绘制一些简单的图形和图像,显示png图片,显示字符串等. 在Android设备中譬如,关机充电动画,自动测试程序,recovery模式 ...
- Android 双屏异显(兼容android8)
1.双屏判断(是否支持双屏异显) 2.权限申请(android 6 以后需要申请权限) 3.客显实例化 (客显布局) public void initDiffDisplay() {try {Displ ...
- Android 双屏异显
背景: 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看.这里就涉及到 Android 的双屏异显的问 ...
- android 分屏投影,Android 双屏异显实现的三种方式
在各种产品脑洞大开的时代,需求也是日益新异,笔者最近开发了一套双屏异显app.现在做一些总结 1.双屏异显第一种实现方式(官方提供的Presentation) Android 提供了一个叫 Prese ...
最新文章
- 存储器里面的一个采用直接映射方式的32KB缓存-一个四路组相连的缓存,容量为16KB
- Spring定时任务的配置
- EJS学习(三)之语法规则中
- 您的主机不满足在启用Hyper-V 或DeviceCredential Guard的情况下运行VMware player的最低要求
- FineReport 11.0 五大全新功能,让报表开发更快、更好看
- 北大青鸟ASP.NET之总结篇
- 关闭IE窗口时执行事件
- 如何合理地决定线程池大小?
- codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)
- 工作流Jpbm4.4工作流知识点总结(工作流开发宝典)
- 68超标量流水线的基本概念
- 网银爬虫系统(爬取网银流水,爬取网银余额)难点分析
- 【机器学习】支持向量机原理与序列最小最优化算法SMO
- Oracle查询排列组合,Oracle SQL排列组合之组合问题
- 关于哪些信息是个人隐私信息
- linux oracle实例名查看,Linux环境下oracle数库库改名,实例改名
- Echarts模板(一):南丁格尔玫瑰图
- 作为一名程序员,我都收集了哪些好玩的生成器?
- 2021最新Spring Boot 面试题
- FFmpeg--一个操作视频音频的强大工具