文档章节

Android presentation

当空皓月
 当空皓月
发布于 2017/05/05 16:52
字数 1002
阅读 41
收藏 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
郑州
日新月异的Android新技术

学习Android技术开发已经很久啦,感觉Android技术开发太快,几乎每年都有很多新东西出现,想要覆盖所有新东西感觉也不太可能,我这里主要说一下主要的 Android 的主要新技术发展,其实了解 ...

crossmix
2015/11/09
0
0
2015年Android开发新技术

开发工具 Android Studio : Google 官方放弃 Eclipse 和Android Studio 普及。AS 虽然不算新,但是对 Android Studio 这个软件的更新速度快的惊人,有大量的新功能发布。例如支持很多注解代...

程序袁_绪龙
2015/07/24
0
0
关于Android MVP模式的思考

这一周对现有的Android项目进行了框架重构,使用MVP模式来重新构建整个项目和包结构。今天就来总结一下我在这个过程中理解和实践吧。 MVP概述 MVP是指Model,View和Presenter的缩写,是MVC模...

carpediem123
2017/03/12
0
0
没有AI芯片,你的手机也能实现离线神经网络机器翻译

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

微软亚洲研究院
04/19
0
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Go interface{} to string

package mainimport "fmt"func main() {var a interface{}a = "dsadjaldaldad"var b stringb = a.(string) // 话说,用人话说的话,这叫什么操作?fmt.Println(a, b)}...

taadis
16分钟前
0
0
数据库防火墙

数据库防火墙顾名思义是一款数据(库)安全设备,从防火墙这个词可以看出,其主要作用是做来自于外部的危险隔离。换句话说,数据库防火墙应该在入侵在到达数据库之前将其阻断,至少需要在入侵...

突突突酱
25分钟前
1
0
RDBMS 关系型数据库与 NoSQL 全面比较

随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 低延迟的读写速度:应用快速地反应能极大地提升用户的满...

PeakFang-BOK
34分钟前
1
0
徒弟做了一个Python的实战小项目——银行系统

国际惯例:实践是检验真理的唯一标准。 众所周知,在编程过程中理论知识再充实也需要通过项目的炼金石。下面给大家看一下我徒弟做的一个小项目实战要求,是做一个银行系统,就是我们去银行办...

无也Python
40分钟前
2
0
vue.js响应式原理解析与实现

从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染。之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新...

peakedness丶
59分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部