赞
踩
安卓手机APP开发__媒体开发部分__媒体投屏
目录
在安卓5(API级别21)引入的API android.media.projection 让你能够能够捕捉
到一个显示设备的内容,把它作为一个媒体流,你能播放,录制,或者把它转播给
其它的设备,例如电视。
安卓14(API级别34)引入了APP的屏幕分享,它能让用户分享一个单独的APP的窗口,
而无关窗口的模式,代替了分享整个设备的屏幕。APP屏幕分享排除了状态栏,导航栏
通知,和其它的系统用户界面的元素。仅有被选择的APP的内容被分享。
APP的屏幕分享保护了用户的隐私,增加了用户的生产力,加强了多任务处理,让用户能
同时运行多个APP,仅分享其中一个APP的内容。
一个媒体的投屏捕捉了一个设备显示的内容,或者是APP的窗口,然后投屏把捕捉到的图像
发送给一个虚拟显示,渲染器在一个表面上渲染图像。真实的设备显示被投射到虚拟显示上。
虚拟显示的内容被写到应用提供的"表面"上。
通过使用MediaRecorder, SurfaceTexture, 或者是 ImageReader的方法, 应用提供了表面,
“表面” 消费了被捕捉的显示的内容,并且让你管理由表面渲染的图像。你能保存图像作为一个
录制,或者把它们转播到电视或者是其它的设备。
通过得到一个令牌,让你的APP得到授权,有了捕捉显示设备或者是APP窗口的内容的能力,
这就开始了一个投屏会话。由MediaProjection的类的实例来显示令牌。
当你开启一个新的活动时,使用MediaProjectionManager的系统设备的
getMediaProjection()方法,来创建一个媒体投屏的实例。开始一个活动,用
createScreenCaptureIntent()方法来指定一个屏幕投屏的捕捉操作。
Kotlin
- val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
- var mediaProjection : MediaProjection
-
- val startMediaProjection = registerForActivityResult(
- StartActivityForResult()
- ) { result ->
- if (result.resultCode == RESULT_OK) {
- mediaProjection = mediaProjectionManager
- .getMediaProjection(result.resultCode, result.data!!)
- }
- }
-
- startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())
一个媒体投屏的中心角色是虚拟显示,通过在一个MediaProjection的实例上使用
createVirtualDisplay()方法,你能创建一个虚拟显示。
Kotlin
- virtualDisplay = mediaProjection.createVirtualDisplay(
- "ScreenCapture",
- width,
- height,
- screenDensity,
- DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
- surface,
- null, null)
宽度和高度的参数指定了虚拟显示的维度。为了得到宽度和高度的值,使用
在安卓11(API级别30)引入的API WindowMetrics。
确定媒体投屏的表面的大小,是为了以合适的分辨率生成输出。为了把屏幕
投射到电视或者是电脑的显示器,要让表面变大(低分辨率),为了显示设备
的录制,要让表面变小(高分辨率)。
当捕捉的内容渲染到表面时,安卓12L(API级别32),系统一致性地缩放内容,
维护合适的比例,内容的维度(宽度和高度)都等于或者小于相应的表面的维度。
捕捉的内容在表面的中央。
安卓12L缩放的方法,在确保合适的比例的前提下,通过最大化表面的图像的大小,
提升了屏幕向电视和其它的大型显示设备的投屏性能。
如果你的APP的目标安卓版本是14或者更高,APP的配置文件必须包括一个权限
声明,内容是媒体投屏的前台服务类型:
- <manifest ...>
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
- <application ...>
- <service
- android:name=".MyMediaProjectionService"
- android:foregroundServiceType="mediaProjection"
- android:exported="false">
- </service>
- </application>
- </manifest>
通过调用startForeground()来启动一个媒体投屏的服务。
如果你没有指定前台服务的类型,默认的服务类型是配置文件中定义的类型。
如果在配置文件中还没有指定任何的类型,系统会抛出一个异常
MissingForegroundServiceTypeException。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。