问题描述
我已经编写了使用Camera 2 API的基本代码。现在,我需要一个代码来按一下按钮以编程方式录制视频
如下所示,我将Kotlin用于CameraFragment,将Java用于MainActivity
CameraFragment.kt:
class CameraFragment : Fragment(),ActivityCompat.OnRequestPermissionsResultCallback {
......
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_camera,container,false)
}
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
viewFinder = view.findViewById(R.id.view_finder)
viewFinder.holder.addCallback(object : SurfaceHolder.Callback {
override fun surfaceChanged(
holder: SurfaceHolder?,format: Int,width: Int,height: Int) = Unit
override fun surfaceDestroyed(holder: SurfaceHolder?) = Unit
override fun surfaceCreated(holder: SurfaceHolder?) {
Log.d(TAG,"View finder size: ${viewFinder.width} x ${viewFinder.height}")
view.post { getPermissions() }
}
})
}
........
override fun onStop() {
super.onStop()
try { camera.close() } catch (exc: Throwable) {}
}
override fun onDestroy() {
super.onDestroy()
cameraThread.quitSafely()
}
private suspend fun openCamera(
manager: CameraManager,cameraId: String,handler: Handler? = null
): CameraDevice = suspendCancellableCoroutine { cont ->
val permission = ActivityCompat.checkSelfPermission(
requireContext(),Manifest.permission.CAMERA
)
assert(permission != PackageManager.PERMISSION_GRANTED)
manager.openCamera(cameraId,object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) = cont.resume(camera)
override fun onDisconnected(camera: CameraDevice) {
Log.w(TAG,"Camera $cameraId has been disconnected")
requireActivity().finish()
}
override fun onError(camera: CameraDevice,error: Int) {
}
},handler)
}
private fun initializeCamera() = lifecycleScope.launch(Dispatchers.Main) {
camera = openCamera(cameraManager,cameraManager.cameraIdList.first(),cameraHandler)
val targets = listOf(viewFinder.holder.surface)
session = createCaptureSession(camera,targets,cameraHandler)
captureRequest = camera
.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
.apply { addTarget(viewFinder.holder.surface) }
session.setRepeatingRequest(captureRequest.build(),null,cameraHandler)
}
private suspend fun createCaptureSession(
device: CameraDevice,targets: List<Surface>,handler: Handler? = null
): CameraCaptureSession = suspendCoroutine { cont ->
device.createCaptureSession(targets,object: CameraCaptureSession.StateCallback() {
override fun onConfigureFailed(session: CameraCaptureSession) {
val exc = RuntimeException("Camera ${device.id} session configuration failed")
Log.e(TAG,exc.message,exc)
cont.resumeWithException(exc)
}
override fun onConfigured(session: CameraCaptureSession) {
cont.resume(session)
}
},handler)
}
}
这是代码,我正在使用它初始化CameraFragment
MainActivity.java:
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.camera_fragment);
if (fragment == null) {
} else {
this.cameraFragment = (CameraFragment) fragment;
}
请分享所需的代码以编程方式录制视频
解决方法
看看Google的Camera2Video示例。