【发布时间】:2020-08-24 15:11:25
【问题描述】:
我已经编写了使用 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;
}
请分享以编程方式录制视频所需的代码
【问题讨论】:
标签: java android kotlin android-camera android-camera2