安卓手机APP开发__媒体开发部分__媒体投屏

安卓手机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

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

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的配置文件必须包括一个权限

声明,内容是媒体投屏的前台服务类型:

XML 复制代码
<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。

相关推荐
工程师老罗1 小时前
如何在Android工程中配置NDK版本
android
Libraeking4 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位5 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
iWZXQxBO5 小时前
运动控制卡 倒R角程序 G代码 halcon联合运动控制卡联合相机 运动控制卡内容
音视频
JMchen1236 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs7 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob7 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔7 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9967 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly9 小时前
md模拟器安卓版带金手指2026
android