android 分屏投影,Android 双屏异显实现的三种方式
在各种产品脑洞大开的时代,需求也是日益新异,笔者最近开发了一套双屏异显app。现在做一些总结
1.双屏异显第一种实现方式(官方提供的Presentation)
Android 提供了一个叫 Presentation 类,来实现第二屏, 继承 Presentation 实现第二屏,相当于一个特殊的弹窗窗口(具体实现)
public class DifferentDislay extends Presentation {
public DifferentDislay(Context outerContext, Display display) {
super(outerContext,display);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diffrentdisplay);
}
}
引用:
//双屏显示
DisplayManager mDisplayManager;//屏幕管理类
Display[] displays;//屏幕数组
mDisplayManager =(DisplayManager)MainActivity.this.getSystemService(Context.DISPLAY_SERVICE);
displays =mDisplayManager.getDisplays(); //得到显示器数组
DifferentDislay mPresentation =new DifferentDislay
(getApplicationContext(),displays[1]);//displays[1]是副屏
mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mPresentation.show();
所需权限:
注:以上是以 Presentation 实现的双屏异显,这种方式比较适合双屏独立操作没有交际的时候,如果存在双屏同显,或者两者之际要有一些数据同步,后比较麻烦,
比如:主屏播放适配 - >投影到第二屏,上面这种方法不适用了,因为涉及到适配同步显示,还有主副屏幕都要启动一个播放器才能实现,性能极大的浪费,设备性能比较好,还可以以这种方式实现,如果设备性能不是很好,使用这种方式后照成视频卡顿,严重者可能解码失败,照成视频无法播放等等一些列并发问题
针对上面开启第二屏 双屏同显,播放视频,我在原来的基础上做了极大的改善,可以避免启动两个播放器,照成性能的浪费
2.双屏异显(同显)实现方式
相信做双屏异显的同胞们,肯定看过来Presentation 的源码 ,源码中显示 Presentation 是继承与 Dialog 来实现的,在文章的开头我也有提到过,第二屏可以看作一个特殊的 Dialog 来实现
在研究Presentation 源码的时候发现它是通过 Window w = getWindow(); 来获取了一个窗口,做我们android 开发的都知道 Window是android 顶级窗口,看到这里我在想为何自己不能直接去创建一个窗口然后获取屏幕数组放置在第二屏幕上呢?往下看
public void addPresentation(Context paramContext) {
Display display = ((MediaRouter) paramContext.getSystemService(Context.MEDIA_ROUTER_SERVICE)).getSelectedRoute(2).getPresentationDisplay();
this.secondDisplay = display;
if (display != null) {
this.windowManager = (WindowManager) paramContext.createDisplayContext(display).getSystemService(Context.WINDOW_SERVICE);
this.secondDisplayContext = paramContext.createDisplayContext(this.secondDisplay);
return;
}
}
上述代码我们获取窗口管理器,通过paramContext创建了第 paramContext.createDisplayContext(this.secondDisplay); 第二屏幕
创建好第二屏幕以后我们去给第二屏屏幕添加一个view
public View addView(int paramInt) {
this.view = View.inflate(this.secondDisplayContext, paramInt, null);
this.layoutParams = new WindowManager.LayoutParams(2003, 3, 3);
if (Build.VERSION.SDK_INT >= 23) {
this.layoutParams.type = 2038;
} else {
this.layoutParams.type = 2003;
}
this.windowManager.addView(this.view, this.layoutParams);
return this.view;
}
这样我们的第二屏幕就已经完成,只需要根据自己的需求创建一个布局,调用addView方法添加进去,把添加进去的view返回出去,在主类中进行操作,就解决了数据数据同步问题
以下是完整代码
public class HelpHandPresentation {
private WindowManager.LayoutParams layoutParams;
private Display secondDisplay;
private Context secondDisplayContext;
private View view;
private WindowManager windowManager;
public void addPresentation(Context paramContext) {
Display display = ((MediaRouter) paramContext.getSystemService(Context.MEDIA_ROUTER_SERVICE)).getSelectedRoute(2).getPresentationDisplay();
this.secondDisplay = display;
if (display != null) {
this.windowManager = (WindowManager) paramContext.createDisplayContext(display).getSystemService(Context.WINDOW_SERVICE);
this.secondDisplayContext = paramContext.createDisplayContext(this.secondDisplay);
return;
}
}
public View addView(int paramInt) {
this.view = View.inflate(this.secondDisplayContext, paramInt, null);
this.layoutParams = new WindowManager.LayoutParams(2003, 3, 3);
if (Build.VERSION.SDK_INT >= 23) {
this.layoutParams.type = 2038;
} else {
this.layoutParams.type = 2003;
}
this.windowManager.addView(this.view, this.layoutParams);
return this.view;
}
public void presentationAddView() {
this.windowManager.addView(this.view, this.layoutParams);
}
public void removeLayoutView() {
this.windowManager.removeView(this.view);
}
}
相当于一个工具类,只复制到项目里可以直接使用
以下是调用方式
HelpHandPresentation helpHandPresentation = new HelpHandPresentation();
helpHandPresentation.addPresentation(context);
View view = helpHandPresentation.addView(layout);
三行代码即可,调用方便
3.双屏异显还有一种方式是通过 投影来实现的,每次投影都会弹提示框,进行确认,有一定的局限性
(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
有兴趣的可以看看 MediaProjectionManager 源码实现,这里就在叙述了
完结
这篇文章呢,作为一个开头,后续笔者会针对这一模块 发布一套三方sdk,方便大家使用,节省开发时间
欢迎业界各位同胞提一些好的意见,我会总结归纳,进行梳理,更好的完善sdk的开发进度与工作
有缘留个关注把
android 分屏投影,Android 双屏异显实现的三种方式相关推荐
- 安卓系统双屏异显_Android 双屏异显实现的三种方式
在各种产品脑洞大开的时代,需求也是日益新异,笔者最近开发了一套双屏异显app.现在做一些总结 1.双屏异显第一种实现方式(官方提供的Presentation) Android 提供了一个叫 Prese ...
- 【RK3288 Android 7.1 / KEN】双屏异显流程
RK3288_Android 7.1 双屏异显流程 异显功能使能 控制代码位置: 触发异显 控制代码位置: 方法 1 主要流程: 方法 2 关键步骤: 异显流程 控制代码位置: setOnlyShow ...
- [多屏互动] 实现双屏异显一:安卓Presentation
文章目录 前言 一.Presentation是什么? 二.实现多屏异显 1.实现方式 2.实现方法 连接外接屏幕的数目 把sencond activity的内容显示到第2块屏幕 关闭外接屏幕的显示 注 ...
- android解析XML总结(SAX、Pull、Dom三种方式)
在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式. 今天解析的xml示例(channels.xml)如下: 1 <?xml v ...
- android友盟错误日志,友盟崩溃日志分析三种方式
第一种:采用友盟提供的工具 1.再友盟错误页面,右下角,有一个保存错误日志的. 比如:xxx iOS_错误分析_错误详情_100442.csv 2.把xxx.app.dSYM 放到这个目录下~/Lib ...
- Android 双屏异显(Presentation) 开发,将第二个页面投屏到副屏上
1. 背景 最近开发的一个项目,有两个屏幕,需要将第二个页面投屏到副屏上, 这就需要用到Android的双屏异显(Presentation)技术了,研究了一下,这里做下笔记. 我们那个副屏是一块汽车的 ...
- 安卓系统双屏异显_双屏异显在Android系统上的实现
康金荣+彭宏利 摘 要:提出了一种在ARM/Android平台上实现双屏异显功能的方法.所谓双屏异显,即在同一软硬件平台上,实现同时驱动两块LCD屏幕,并且这两块屏幕所显示的内容可以不同.这种功能的实 ...
- RK3288 双屏异显,两屏默认方向不一致
CPU:RK3288 系统:Android 5.1 RK3288 支持双屏异显,一般都会同方向显示,如果遇到两个 lcd 的默认方向不一致,只需修改下面参数即可. 例如:主屏为mipi接口,分辨率为 ...
- rk3288android强制横屏,RK3288 6.0 双屏异显,横屏+竖屏【转】
RK3288 6.0 双屏异显,横屏+竖屏 由于是横屏+竖屏的组合,目前考虑两种实现方案.1.副屏存在黑边 2.对副屏内容进行拉伸. 默认情况下,我们设置的双屏初始rotation都为Surface. ...
最新文章
- 六十七、SpringBoot嵌入式的Servlet容器和创建war项目
- lesson3 数码管静态显示及定时器和中断应用
- 史上超强的学科碰撞,有生之年必看系列!
- Lydsy2017年4月月赛 抵制克苏恩
- LeetCode 732. 我的日程安排表 III(差分思想)
- windows11怎么绕过tpm安装,win11在线安装
- 在电子表格计算架构上应用稀疏数组技术的设计
- 韩犯罪团伙雇朝鲜***从中国发动***
- Thinking in java Java编程思想 该不该读
- vs2013的mfc开发上位机
- 在Carmaker中建立自己的交通环境
- 解决设置easyUI tabs onSelect事件时提示tabs未定义的方法
- 看共享单车上的智能车锁有何区别
- python面向对象编程实例:烤地瓜
- Oracle11g导入DMP文件并导出为CSV文件过程全纪录
- 高数-数列极限与函数极限
- java智力题扑克牌_数学智力题:猜扑克牌
- C++设计模式 | 四种创建型模式——简单工厂模式、工厂方法模式、抽象工厂模式、单例模式...
- 人工智能1—K-means聚类算法
- 道路测量xy坐标表示什么_直线度影像测量仪