文档章节

Android presentation

当空皓月
 当空皓月
发布于 2017/05/05 16:52
字数 1002
阅读 22
收藏 0
点赞 0
评论 0

对于双屏异显(lcd 和 hdmi 的双屏异显),android框架已经支持,但是底层接口功能还是要自己去实现,且需要底层驱动支持。

使用presentation 去画第二个display就好了。

1 MediaRouter mediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
2 MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
3 if(route != null) {
4      Display presentationDisplay = route.getPresentationDisplay();
5      if (presentationDisplay != null) {
6            Presentation presentation = new MyPresentation(context, presentationDisplay);
7            presentation.show();
8      }
9 }

应用在辅助显示器上显示不同的内容程序,以有线或Wi-Fi将外接显示输出连接到用户设备上,显示独特的内容。

注意:public Presentation (Context outerContext, Display display) 这个初始化函数,这里的outerContext必须要activity,一个activity的context,虽然presentation会创建自己的context,但是它是在这个参数context之上的,而且这个activity跳转后presentation就消失了,如果说用getApplicationContext()就直接报错,也不行。

要为辅助显示屏创建独特的内容:

1. 您需要扩展Presentation类,并实现onCreate()回调方法。在onCreate()中,调用setContentView()来指定您要在辅助显示屏上显示的UI。

2. 作为Dialog类的扩展,Presentation类提供了一个区域,在其中,您的应用可以在辅助显示屏上显示不同的UI。

获取显示Presentation的辅助显示屏:

1. 可以使用DisplayManager或者MediaRouter的API。其中,使用DisplayManagerAPI可以使您获得当前连接的所有显示屏的枚举,而MediaRouter则可以使您直接访问系统为Presentation设置的默认显示输出。

2. 可以给MediaRouter.getSelectedRoute()传一个ROUTE_TYPE_LIVE_VIDEO来获得演示的默认显示器。它将返回一个MediaRouter.RouteInfo对象,描述了系统为视频演示所选择的当前路由。如果MediaRouter.RouteInfo不空,调用getPresentationDisplay()即可获取当前连接的显示屏对象:Display。

3. 然后,您可以将这个Display对象传入Presentation的构造函数。调用Presentation.show()方法,演示就会出现在辅助显示屏上了。

为在运行时即时检测新接入的显示器,需要先创建一个MediaRouter.SimpleCallback的实例。在其中,您需要实现onRoutePresentationDisplayChanged()回调方法。当新的显示器连接时,系统会调用这个回调方法。

1 private final MediaRouter.SimpleCallback mMediaRouterCallback =
 2             new MediaRouter.SimpleCallback() {
 3         @Override
 4         public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
 5             Log.d(TAG, "onRouteSelected: type=" + type + ", info=" + info);
 6             updatePresentation();
 7         }
 8 
 9         @Override
10         public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
11             Log.d(TAG, "onRouteUnselected: type=" + type + ", info=" + info);
12             updatePresentation();
13         }
14 
15         @Override
16         public void onRoutePresentationDisplayChanged(MediaRouter router, RouteInfo info) {
17             Log.d(TAG, "onRoutePresentationDisplayChanged: info=" + info);
18             updatePresentation();
19         }
20     };
1 private void updatePresentation() {
 2         // Get the current route and its presentation display.
 3         MediaRouter.RouteInfo route = mMediaRouter.getSelectedRoute(
 4                 MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
 5         Display presentationDisplay = route != null ? route.getPresentationDisplay() : null;
 6 
 7         // Dismiss the current presentation if the display has changed.
 8         if (mPresentation != null && mPresentation.getDisplay() != presentationDisplay) {
 9             Log.i(TAG, "Dismissing presentation because the current route no longer "
10                     + "has a presentation display.");
11             mPresentation.dismiss();
12             mPresentation = null;
13         }
14 
15         // Show a new presentation if needed.
16         if (mPresentation == null && presentationDisplay != null) {
17             Log.i(TAG, "Showing presentation on display: " + presentationDisplay);
18             mPresentation = new DemoPresentation(this, presentationDisplay);
19             mPresentation.setOnDismissListener(mOnDismissListener);
20             try {
21                 mPresentation.show();
22             } catch (WindowManager.InvalidDisplayException ex) {
23                 Log.w(TAG, "Couldn't show presentation!  Display was removed in "
24                         + "the meantime.", ex);
25                 mPresentation = null;
26             }
27         }
28 
29         // Update the contents playing in this activity.
30         updateContents();
31     }
1 private void updateContents() {
 2         // Show either the content in the main activity or the content in the presentation
 3         // along with some descriptive text about what is happening.
 4         if (mPresentation != null) {
 5             mInfoTextView.setText(getResources().getString(
 6                     R.string.presentation_with_media_router_now_playing_remotely,
 7                     mPresentation.getDisplay().getName()));
 8             mSurfaceView.setVisibility(View.INVISIBLE);
 9             mSurfaceView.onPause();
10             if (mPaused) {
11                 mPresentation.getSurfaceView().onPause();
12             } else {
13                 mPresentation.getSurfaceView().onResume();
14             }
15         } else {
16             mInfoTextView.setText(getResources().getString(
17                     R.string.presentation_with_media_router_now_playing_locally,
18                     getWindowManager().getDefaultDisplay().getName()));
19             mSurfaceView.setVisibility(View.VISIBLE);
20             if (mPaused) {
21                 mSurfaceView.onPause();
22             } else {
23                 mSurfaceView.onResume();
24             }
25         }
26     }

为针对辅助显示进一步优化Presentation的UI,您需要为您的应用或activity指定标签为android:presentationTheme主题。

请留意,连接到用户移动设备的屏幕往往有较大的屏幕尺寸和不同的屏幕密度。由于屏幕特征可能不同,您需要为大型显示设备提供特定优化的资源。如果您需要从Presentation中获取额外的资源,调用getContext().getResources()来获取针对这种显示的资源对象。这样,您的应用就可以根据辅助显示器的尺寸和密度提供最合适的资源了。

© 著作权归作者所有

共有 人打赏支持
当空皓月
粉丝 13
博文 179
码字总数 67070
作品 0
郑州
没有AI芯片,你的手机也能实现离线神经网络机器翻译

     编者按:去年10月份,微软跟华为合作,首先在具有AI芯片的Mate 10手机上实现了AI驱动型离线翻译功能。现在,Microsoft Translator将这一功能扩展到所有安卓、iOS和亚马逊Fire设备,...

微软亚洲研究院 ⋅ 04/19 ⋅ 0

android:excludeFromRecents 属性需要注意的小地方

在 Android 系统中,如果我们不想某个 Activity 出现在 “Recent screes” 中,可以设置 属性 android:excludeFromRecents 为 true。其中有些需要注意到的地方说明下。 android:excludeFromR...

夏洛克的喵 ⋅ 06/12 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

VirtualApk启动插件Activity

插件以APK的形式保存在SD卡上,通过startActivity方式启动Activity需要首先将Activity注册到AndroidManifest.xml,如果没有注册就会出现如下错误。 要实现插件Activity的启动需要解决以下问题...

JasmineBen ⋅ 05/16 ⋅ 0

Android插件化原理(一)Activity插件化

相关文章 Android深入四大组件系列 Android解析AMS系列 Android解析ClassLoader系列 前言 四大组件的插件化是插件化技术的核心知识点,而Activity插件化更是重中之重,Activity插件化主要有三...

刘望舒 ⋅ 05/29 ⋅ 0

《Android开发艺术探索》Activity | 生命周期 | 启动模式 | Flags | IntentFilter action data的匹配规则 (一)

说几点 1.文章中大部分(所有吧)的内容都是与《Android开发艺术探索》书中写的内容是一致的,所以可以说是直接copy了一遍(没办法,作者写的太好了)。 2.为什么要copy一遍呢?,主要还是为...

a_zhon ⋅ 05/09 ⋅ 0

Android系统源码分析团体项目BeesAndroid正式上线啦

嗨,BeesAndroid开源技术小组正式成立啦,Bees,即蜜蜂,取义分享、合作与奉献的意思,这也是BeesAndroid小组的宗旨,我们第一个团体项目BeesAndroid也于2018年3月6日同步上线,该项目的前 ...

郭孝星 ⋅ 03/08 ⋅ 0

谷歌公布 5 月安卓各版本份额:更多人吃上“奥利奥”

Google 在 2018 I/O 开发者大会上发布了主打智能化的 Android P ,并向部分机型推出 Android P 的预览版,这让许多 Android 用户对 Android P 的正式到来充满期待。不过,从厂商对已有版本的...

王练 ⋅ 05/10 ⋅ 0

Android Studio 3.1.2 bug 修复版发布,改进 lint 审查

Android Studio 3.1.2 bug 修复版已发布,本次更新修复了一些错误,并改进了某些场景下 lint 审查的速度。详细的修复内容请查看 Android Studio 3.1.2 的发布说明。 此外,Android Studio 3....

局长 ⋅ 04/24 ⋅ 1

Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim编辑模式、命令模式

编辑模式 vim要从一般模式进入编辑模式只要按字母 i 、I、a、A、o、O键就可以了 要从编辑模式回到一般模式按键盘上的Esc键即可。 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 o ...

黄昏残影 ⋅ 29分钟前 ⋅ 0

OSChina 周五乱弹 —— 如果有一天不当程序员了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享off的单曲《我唱情歌给你听》 《我唱情歌给你听》- off 手机党少年们想听歌,请使劲儿戳(这里) @小小编辑 :#如果不做程序...

小小编辑 ⋅ 36分钟前 ⋅ 5

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部