> Android屏幕采集MediaProjection和MediaProjectionManager ,Android5.0

-- MediaProjectionManager,MediaProjection,VirtualDisplay录屏:
 Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
 startActivityForResult(captureIntent, REQUEST_CODE);    @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode != PERMISSION_CODE) {
             Log.e(TAG, "Unknown request code: " + requestCode);
             return;
         }
         if (resultCode != RESULT_OK) {
             Toast.makeText(this,
                     "User denied screen sharing permission", Toast.LENGTH_SHORT).show();
             return;
         }
         mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
         mMediaProjection.registerCallback(new MediaProjectionCallback(), null);
         mVirtualDisplay = createVirtualDisplay();
     }

android5.0屏幕录制-
Android视频录制--MediaProjection-

> 双屏开发(Presentation副屏/客显)

双屏异显(lcd 和 hdmi 的双屏异显),android框架已经支持,但是底层接口功能还是要自己去实现,且需要底层驱动支持。使用presentation 去画第二个display就好了。
  android 5.0之后可以使用一个特殊的对话框就是presentation,presentation可以绑定一个display(可以是virtualdisplay或是真的用于显示的display),之后可以将显示的在应用之外内容绘制到presentation上(便可以显示在display之中)。今天看到一个应用做法很好,把自身应用投射到另外一块屏幕,本屏幕显示自身应用时就只显示一个悬浮层,而这位悬浮层就是利用presentation显示在本应用所安装设备的显示屏幕的display上面。
  Google也是不负众望在Android4.2(API17) 版本以后提供了Presentation类,可以轻松实现在两块屏幕上同时显示不同的内容。
  Presentation是一个特殊的dialog,它的目的是显示内容到第二屏幕。在Presentation创建的时候关联一个目标设备,确定Presentation要显示在那个设备上,根据这个设备的信息来配置Presentation的context和resources信息。
  Presentation的context与包含它的Activity的context是不相同的,用presentation的上下文来填充一个presentation的layout和加载其它的资源是非常重要的,可以确保我们加载的目标设备正确的尺寸密度assets。
  当Presentation附属的display被移除的话,Presentation就会自动被取消。当创建Presentation的Activity自己处于paused或者resumed,无论Presentation在显示什么内容,该Activity就要关心对Presentation 进行pausing and resuming。

Android Presentation是什么-
android presentation-
双屏开发 Presentation副屏/客显的使用-
android presentation实现双屏异显-
Android Api Demos登顶之路(十二)Presentation-
Android7.1 Presentation双屏异显原理分析-

> 跳出手机的Dialog--Presentation
 presentation的定义:A presentation is a special kind of dialog whose purpose is to present content on a secondary display. presentation 是一种特殊的 dialog ,目的是为了在辅助屏幕上展示不同的内容。

  要为辅助显示屏创建独特的内容:
 1. 您需要扩展Presentation类,并实现onCreate()回调方法。在onCreate()中,调用setContentView()来指定您要在辅助显示屏上显示的UI。
 2. 作为Dialog类的扩展,Presentation类提供了一个区域,在其中,您的应用可以在辅助显示屏上显示不同的UI。

  首先Presentation是Android 4.2引出的,与之同时Android 4.2 还支持 Miracast 影像传输协议。所以它俩一定是有联系的。Miracast是一种基于WIFI的传输协议,Android 4.2以上的手机、Win8电脑、智能电视、盒子几乎都是支持它的。
  在Presentation中的getContext得到的context与它依附的Activity的context是不同的,Presentation的context是目标屏幕属性的context,包含着辅助屏幕的属性信息。

> 获取辅助屏幕有两种方式:MediaRouter或者DisplayManager
 1.MediaRouter: 利用MediaRouter的API寻找周围设备是一种最简单的方式了,它会直接绑定周围最合适的设备。
  选择显示presentation的设备最简单的方法就是使用Media Router,media router服务持续追踪在系统中哪个音频视频线路是可用的,当routes被选择或者不被选择,或者更好的显示presentation display的线路发生改变后media router就会发送消息。所以一些应用程序可以自动监视这些消息来在首选设备上显示或取消presentation。
  首选显示presentation的设备是Media Router进行推荐的,如果应用想要显示内容在第二屏幕上就该使用该设备。有时可能没有首选显示presentation的设备,在这种情况下,应用可以在本地显示内容而不使用presentation。

 2.DisplayManager: 第二种搜索设备的方法是DisplayManager,他可以搜索周围所有可用的display,产生一个display数组,然后你就可以选择合适的设备进行展示了。
  display manager:另外一个获取首选display的方法是直接使用display Manager来获取。display manager服务提供方法枚举和描述系统中所有的设备,包括可以显示presentation的设备。display manager持续追踪系统中所有的设备,然而,并不是所有的设备都适合显示presentation,例如,如果一个Activity试图在主屏幕上显示一个presentation,它可能会掩盖自己的内容,这就象在Activity上打开一个dialog一样。

MediaRouter mediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
  MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
  if(route != null) {
       Display presentationDisplay = route.getPresentationDisplay();
       if (presentationDisplay != null) {
             Presentation presentation = new MyPresentation(context, presentationDisplay);
             presentation.show();
       }
  }