android presentation

对于双屏异显(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()来获取针对这种显示的资源对象。这样,您的应用就可以根据辅助显示器的尺寸和密度提供最合适的资源了。

关于 Presentation api:http://android.toolib.net/reference/android/app/Presentation.html

时间: 2024-10-10 08:57:02

android presentation的相关文章

Android进阶笔记14:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListener(),findViewById()这些不必要的代码,连如BufferKnife那样的InjectView都不需要,因为你的代码一般不需要依赖于这些界面组件信息.下面以一个最简单的AndroidMVVM为例. (1)layout 布局 <LinearLayout xmlns:android="

Android在MediaMuxer和MediaCodec用例 - audio+video

在Android多媒体类,MediaMuxer和MediaCodec这是一个相对年轻,他们是JB 4.1和JB 4.3据介绍. 前者被用来产生一个混合的音频和视频的多媒体文件.的缺点是,现在可以只支持一个audio track而一个video track,而唯一支持mp4出口.然是新生事物,相信之后的版本号应该会有大的改进.MediaCodec用于将音视频进行压缩编码,它有个比較牛X的地方是能够对Surface内容进行编码,如KK 4.4中屏幕录像功能就是用它实现的. 注意它们和其他一些多媒体相

android多媒体框架学习 详解 最新版本

一:多媒体框架概述   jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefright),jni和 java api 还是保留在原来的位置,改革还不够彻底,但还是迈出了这一步,以后维护能更好的进

Android 你应该知道的学习资源 进阶之路贵在坚持

1.国外教程网站 Android Developers Blog 不解释 vogella 很不错的网站,免费的,包含android的教程也比较全面,并且教程中经常引用大牛blog,会有很多意外发现.代码资源有提供,但是不是很好找. 非常推荐 tutorialspoint 非常适合入门,提供基本所有的基础教程,并且N多的例子.除了支持在线学习外,还提供基本教程和进阶教程的pdf下载.(ps:虽然Pdf可以点击下载,但是人家还是希望您能付款的.) 非常推荐 tutsplus 每篇文章质量都非常高--

Android实例-路径信息及文件和文件夹的操作(XE8+小米2)

unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 =

例子Architecting Android…The clean way?----代码分析

Presention层: 整个应用启动的时候,就执行依赖的初始化.编译项目之后,Dagger依赖框架使用ApplicationComponent生成一个DaggerApplicationCOmponent. 1. 首先进行依赖的生成 在Application中,调用initializeInjector()就会促使Dagger框架进行依赖生成. ApplicationComponent 对其它Component提供Context,ThreadExecutor,PostExecutionThread

delphi android 录像(调用Java的功能)

delphi xe系列自带的控件都无法保存录像,经网友帮忙,昨天终于实现了录像功能(但有个问题是录像时无画面显示),程序主要使用了JMediaRecorder,MediaRecorder的使用方法可参考网上java的相关说明,下面代码是可以正常录像的: unit Unit8; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, Androidapi.Helpe

Xamarin.Android和UWP之MVVM的简单使用(一)

0x01 前言 就目前而言,MVVM可以说是挺流行的,无论是web端还是移动端,web端的主要代表angularjs,avalonjs等, 移动端(xamarin,uwp)的代表应该是mvvmlight,mvvmcross等, 我们的主题是移动端,所以主要讲mvvmlight,mvvmcross,这篇主要讲MvvmLight,下篇讲MvvmCross. 还是以Demo的形式来谈使用. 0x02 简单的MVVM(mvvmlight) Demo 先来个web版最简单的MVVM效果,然后在按xamar

从零开始的Android新项目1 - 架构搭建篇

记录一下新项目的搭建. 试想一下,如果没有历史负担,没有KPI压力,去新搭建一个项目,你会怎么设计和实现呢? 本系列文章不是教你怎么从0开始学Android,从0开始怎么建一个项目,而定位于零负担的情况下,在2016年怎么去创建一个好的Android项目,其中一部分技术并不太适合刚入门的初学者. Application specific 类似clean architecture,分为三层 presentation - data - domain. 关于Clean Architecture由于国内