背景:

日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现 Android 的双屏异显,Google 也提供了相应的 API 方法 Presentation。

1 Presentation 介绍

要了解 API 的具体调用,推荐先查看官方的文档:Presentation文档
Android 从4.2开始支持双屏显示,开发时需 minSdkVersion >= 17 。Android 连接两个屏幕时,自动分配主屏和副屏,主屏显示正常的 Activity 界面,副屏通过创建 Presentation 类来实现。
通过查看 Presentation 继承关系可知,Presentation 继承自 Dialog,创建的时候需要遵循 Dialog 相关要求。当和 Presentation 相关联的屏幕被移除后,Presentation 也会自动的被移除,所以当 Activity 处于 pause 和 resume 的状态时,Presentation 也需要特别注意当前显示的内容的状态。

2 创建 Presentation

public class MyPresentation extends Presentation {private Context context;private Display display;public MyPresentation(Context outerContext, Display display) {super(outerContext, display);this.context = outerContext;this.display = display;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_presentation);initView();}private void initView() {findViewById(R.id.dismiss).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dismiss();}});}
}

创建 Presentation 后,自动生成构造函数,构造函数中

  • outerContext:上下文环境,可以是主屏 Activity,ApplicationContext 或者 Service
  • display:副屏的 Display

OnCreate 方法中完成布局的初始化,可设置相应按钮的监听,关闭当前 Presentation,执行 dismiss() 方法即可(前提:副屏支持点击)

3 获取屏幕 Display 信息

创建好 Presentation 后,需要在主屏 Activity 上获取屏幕的 Display 信息,让其显示副屏信息,Android 系统提供了两个方式来获取 Display 信息。

3.1 MediaRouter 方式

MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO);
if (route != null) {Display presentationDisplay = route.getPresentationDisplay();if (presentationDisplay != null) {MyPresentation myPresentation = new MyPresentation(MainActivity.this, presentationDisplay);myPresentation.show();}
}

3.2 DisplayManager 方式

DisplayManager mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = mDisplayManager.getDisplays();
if (displays.length > 1) {//displays[0] 主屏,displays[1] 副屏MyPresentation myPresentation = new MyPresentation(MainActivity.this, displays[1]);myPresentation.show();
}

在 Activity 中添加上面的代码后,即可实现双屏双显的效果。

4 双屏双显的优化:

4.1 副屏显示 Toast 提示

通过上面的方法实现双屏双显后,如果在Presentation创建 Toast 提示,会出现提示显示在主屏上的问题,这里需要注意创建 Toast 的 Context 参数。

Toast.makeText(getContext(),"副屏Toast",Toast.LENGTH_SHORT).show();

4.2 副屏内容常驻,不退出

因为 Presentation 相当于在主屏的 Activity 上创建了一个特殊 Dialog,所以 Presentation 会随着主屏 Activity 的生命周期显示隐藏,如何让副屏常驻,不随主屏 Activity 退出。在 Dialog 中,我们知道可以通过创建系统级弹框的方式来做,Presentation 中也是一样。

  • 添加系统权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
  • 在 Presentation 中添加系统弹框代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
} else {getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}

Android8.0 及以上的系统只能使用 TYPE_APPLICATION_OVERLAY 窗口类型来创建悬浮窗。

5 Presentation 限制

  • Presentation 实际上是一个特殊的 Dialog,因此在 Presentation 中无法创建 Fragment、Popupwindow 等组件。
  • Presentation 显示的副屏和主屏的尺寸是不相同的,绘制 UI 时需特别注意。

6 调试

如果没有多屏设备也可以使用模拟器,或者普通 Android 设备来进行双屏异显的调试。打开"设置-开发者选项"界面,在列表中找到"模拟辅助显示设备"条目。点击后,在弹出的对话框中选择副屏的分辨率:


每种分辨率都有安全和默认两种,安全模式会有一些限制,比如无法截屏。比如我们选中1080p,模拟器屏幕的左上角上会立即呈现出副屏的窗口,其显示内容默认为与主屏显示一致:


副屏窗口就是一个 Dialog,可以拖动,让其显示在合适的位置。这里的副屏是不支持触摸动作的。
运行测试程序,效果如下:

7 示例代码下载

presentation-sample

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双屏异显另辟蹊径---minui的移植

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

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

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

  7. Android双屏异显

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

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

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

  9. 【转载】Android 双屏异显方案

    一.技术的背景 随着电梯广告传媒行业的飞速发展,双屏广告机应运而生,客户可以根据自己的需求,制作两个屏幕的内容,分别播放适合屏幕显示方式播放的内容,如上面播放视频,下面播放图片,使得宣传的效果多样化. ...

最新文章

  1. android与单片机wifi通信原理图,用LT8920做2.4G无线通信原理图与51单片机程序
  2. WPF中获取鼠标相对于桌面位置
  3. 分享大麦UWP版本开发历程-03.GridView或ListView 滚动底部自动加载后续数据
  4. WinForm 窗体之间交互的一些方法-兼托管事件
  5. 如何解决ORA-04031错误
  6. “老师,请您多关注一下我吧!!!”
  7. 嵌入式学习之Qt入门第七篇
  8. RedHat系统安装nextcloud
  9. java中怎样将字符串转化为date_java如何将string类型转为date类型?怎样转?
  10. 工行u盾显示316_工行银行网上交易老是提示插入u盾
  11. 使用HealthKit过程中遇到的坑
  12. 系列之FIRST——跑酷小游戏:关卡+BOSS+技能版
  13. 台式计算机如何升级,电脑硬件如何升级:PC硬件升级不盲目 对症下药最靠谱
  14. 本博客博文介绍和索引【花谢悦神】
  15. 百度网盘下载资源太慢,教你一招,速度直接提升到10MB/s
  16. 论文笔记 EMNLP 2020|Resource-Enhanced Neural Model for Event Argument Extraction
  17. NEXUS私服迁移内网(不能百度的那种)、NEXUS私服移植
  18. 关于 python 的 IDE
  19. 前沿人物(零)——伯特霍尔德霍恩
  20. java集合入门和深入学习,看这篇就差不多了

热门文章

  1. 做支付需要了解哪些行业知识
  2. 北京高校应届生就业招聘信息网址
  3. sdisk硬盘加密软件
  4. vue3小兔鲜商城项目学习笔记+资料分享08
  5. 名悦集团分享秋季汽车保养指南,给你更好的用车体验
  6. OpenGL的图形渲染过程
  7. 使用 Nginx 提供 DDNS 服务(中篇)
  8. MOD13Q1数据最大合成NDVI数据
  9. 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件
  10. 内网网速取决于网络设备,而外网网速取决于带宽和用户多少