@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECORD_REQUEST_CODE) {
mediaProjection = projectionManager.getMediaProjection(resultCode, data);
}
}????MediaProjection
????仅仅是一个截图。不会获取到系统的声音。在这里里面出现了第三个类“VirtualDisplay“ ,一个虚拟的显示层。在截屏时,常常伴随一声‘咔嚓’的声音。是不是想到了相机???在自定自定义相机的时候,需要一个承载画面的SurfaceView或者TextureView。在这里截屏也需要一个承载层。到这里“ImageReader“ 也就登场了。
???? 打开“MediaProjection“ ,眼前一亮,可用公共方法也没有几个,一只手就数完了。“registerCallback(),unregisterCallback(),stop(),createVirtualDisplay()“ ,对于注册的一对方法,翻译意思为在状态改变时候进行回调。在学习的几个demo很少有注册使用的,除yrom/ScreenRecorder,这里面有使用前两个方法。
????stop( )
????停止截屏
????createVirtualDisplay( )
????创建投影的承载层,这个方法的参数很多。最后调用的DispalyManager方法。对参数的意思做一个记录。
????在上面的几个参数,后两个可以直接传递为null,surface在可以向Google Samples中传递自己的surface。也可以在只截图的时候传递imageReader.getSurface( ),如果为录制成视频的时候很麻烦,需要是MediaCodec.createInputSurface( ),其中需要自己去做处理。
????对于flags这个参数,不太清楚是是什么意思。(注 : 因为我在测试的环境是公司的平板,没有在手机上测试过)在demo测试的过程中,把 5 中flag都测试了一下,得到的结果都一样,都可以成功截取屏幕。没有遇到网友所的 “VIRTUAL_DISPLAY_FLAG_SECURE“ 情况下截取失败。但是,重要的事情在说一遍,我没有在手机上测试。有知道的大佬,希望告知一下或是一个链接,万分感谢。下面的表格解释来至于Google翻译。虚拟显示几个常量标志字段含义
公共显示:公共虚拟显示和大多数连接到系统其他显示器(如:HDMOH或无线显示器)相同。应用程序可以在显示器上打开窗口,系统可以将其它显示的内容镜像到上面。
如果没有设置时,为Display#FLAG_PRIVATE,私有显示属于创建它的应用程序。只有所有者和已经在该显示器上的应用程序才允许在上面放置窗口。
演示显示:当该标志被设置时,显示在display category注册为DISPLAY_CATEGORY_PRESENTATION,应用程序可以自动将其内容投影到演示文稿显示,以提供更丰富的第二屏幕体验。
这个标志未被设置时,虚拟显示不被登记为演示显示。 应用程序仍然可以在显示器上投影他们的内容,但是他们通常不会自动完成。 该选项适用于更多特殊用途的显示器
安全显示:当该标志被设置时,虚拟显示被认为是安全的,Display#FLAG_SECURE。,例如空中加密,以防止显示内容被拦截或记录在永久介质上。创建一个安全的虚拟显示需要CAPTURE_SECURE_VIDEO_OUTPUT权限。 此权限保留供系统组件使用,不适用于第三方应用程序。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-58101-2.html
脱肛真的不要成本
那苏联人死两千万人