Kotlin中如何在VideoView打开相机并调整为视频通话类小尺寸
Kotlin实现视频通话小尺寸相机效果方案
核心问题说明
你当前提供的代码为调用系统独立相机应用的拍照Intent,会直接跳转至系统相机页面,无法将相机预览嵌入到自身应用的VideoView中实现小窗口效果,需要直接使用相机API将预览流渲染到应用内组件,以下是具体实现方案:
一、应用内嵌入相机预览实现
- 首先添加相机权限,在
AndroidManifest.xml中加入:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera.any" />
- 布局中声明预览容器,如需固定小窗口尺寸可直接写死宽高,适配视频通话小相机规格:
<!-- 小相机窗口,示例为右上角悬浮的120dp*160dp大小,可按需调整尺寸 --> <TextureView android:id="@+id/cameraPreview" android:layout_width="120dp" android:layout_height="160dp" android:layout_alignParentEnd="true" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" />
- 动态申请相机权限后,使用Camera2或CameraX将前置相机预览渲染到TextureView中,也可以将预览流输出到VideoView播放。你提供的跨版本前置相机适配逻辑可以迁移到自定义相机的相机选择逻辑中,兼容不同系统版本的前置调用:
// 前置相机选择适配逻辑 val lensFacing = when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> { CameraCharacteristics.LENS_FACING_FRONT // 适配API 24 安卓7.0版本(三星S6实测可用) } Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { CameraCharacteristics.LENS_FACING_FRONT // 适配API 27 安卓8.0版本(Nexus 6P实测可用) } else -> 1 // 适配API 21 安卓5.0.1版本(三星S4实测可用) }
二、调整相机宽高适配小相机规格
- 预览分辨率设置:在初始化相机时指定目标输出分辨率,匹配小窗口尺寸即可,例如视频通话场景常用的小相机分辨率为240320、360480等,避免输出过高分辨率造成性能浪费
- 预览比例适配:如果需要和主流视频通话应用的小相机比例一致,可选择4:3或者1:1的比例,设置预览容器的宽高比与相机输出比例一致即可避免画面拉伸
- 如果你需要调用系统相机页面时让窗口变小,可以给Intent新增浮窗权限标记,将系统相机页面设为小窗口悬浮,但兼容性较差,更推荐自定义预览的方案。
内容的提问来源于stack exchange,提问作者Muhammad Uzair Ehsan
相关产品推荐
相关产品推荐

