i am implementing an android application and i am trying to record a video using CameraX VideoCapture Api but i am getting some errors and i would like to know to figure them out . Here is the video recording code :
private fun recordVideo() {
binding.buttonCapture.setImageResource(R.drawable.baseline_stop_24)
val currentRecording = recording
if (currentRecording != null) {
// A recording is already in progress, stop it
currentRecording.stop()
recording = null
binding.buttonCapture.setImageResource(R.drawable.baseline_camera_24)
return
}
val name: String = SimpleDateFormat(
"yyy-MM-dd-HH-mm-ss-SSS",
Locale.getDefault()
).format(System.currentTimeMillis())
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, name)
put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
put(MediaStore.MediaColumns.RELATIVE_PATH, "Movies/CameraX-Recorder")
}
val options = MediaStoreOutputOptions.Builder(requireContext().contentResolver, EXTERNAL_CONTENT_URI)
.setContentValues(contentValues)
.build()
recording = videoCapture?.output?.prepareRecording(requireContext(), options)
?.start(ContextCompat.getMainExecutor(requireContext())) { videoRecordEvent ->
// Handle different recording events
when (videoRecordEvent) {
is VideoRecordEvent.Start -> {
// Handle the start of a new active recording
binding.buttonCapture.setImageResource(R.drawable.baseline_stop_24)
}
is VideoRecordEvent.Pause -> {
// Handle the case where the active recording is paused
}
is VideoRecordEvent.Resume -> {
// Handle the case where the active recording is resumed
}
is VideoRecordEvent.Finalize -> {
val finalizeEvent = videoRecordEvent as VideoRecordEvent.Finalize
// Handle the finalize event for the active recording, checking Finalize.getError()
val error = finalizeEvent.error
if (error != VideoRecordEvent.Finalize.ERROR_NONE) {
// Handle error during recording finalization
Toast.makeText(
requireContext(),
"There was an error during video finalization: ${videoRecordEvent.error}",
Toast.LENGTH_SHORT
).show()
} else {
Toast.makeText(
requireContext(),
"The video has been successfully recorded",
Toast.LENGTH_SHORT
).show()
}
binding.buttonCapture.setImageResource(R.drawable.baseline_camera_24)
}
}
// All events, including VideoRecordEvent.Status, contain RecordingStats.
// This can be used to update the UI or track the recording duration.
val recordingStats = videoRecordEvent.recordingStats
}
}
here are errors , i am getting :
Exception while executing runnable androidx.camera.core.impl.utils.executor.SequentialExecutor$1@3592bcb java.lang.UnsupportedOperationException: Albums cannot be directly modified at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:221) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:189) at android.content.ContentProviderProxy.insert(ContentProviderNative.java:549) at android.content.ContentResolver.insert(ContentResolver.java:2151) at android.content.ContentResolver.insert(ContentResolver.java:2113) at androidx.camera.video.Recorder$RecordingRecord.lambda$initializeRecording$1(Recorder.java:2847) at androidx.camera.video.Recorder$RecordingRecord$$ExternalSyntheticLambda0.get(Unknown Source:4) at androidx.camera.video.Recorder$RecordingRecord.performOneTimeMediaMuxerCreation(Recorder.java:3070) at androidx.camera.video.Recorder.setupAndStartMediaMuxer(Recorder.java:1464) at androidx.camera.video.Recorder$4.onEncodedData(Recorder.java:1666) at androidx.camera.video.internal.encoder.EncoderImpl$MediaCodecCallback.lambda$sendEncodedData$3(EncoderImpl.java:1227) at androidx.camera.video.internal.encoder.EncoderImpl$MediaCodecCallback$$ExternalSyntheticLambda10.run(Unknown Source:4) at androidx.camera.core.impl.utils.executor.SequentialExecutor$1.run(SequentialExecutor.java:111) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:231) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:173) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923) 2023-06-08 09:52:05.099 11359-11577 Recorder E FATAL EXCEPTION: CameraX-camerax_io_0 Process: com.ticanalyse.lagfo_kotlin, PID: 11359 java.lang.AssertionError: One-time media muxer creation has already occurred for recording RecordingRecord{getOutputOptions=MediaStoreOutputOptions{fileSizeLimit=0, durationLimitMillis=0, location=null, contentResolver=android.app.ContextImpl$ApplicationContentResolver@2a50ef2, collectionUri=content://media/external/audio/albums, contentValues=_display_name=2023-06-08-09-52-04-760 mime_type=video/mp4 relative_path=Movies/CameraX-Recorder}, getCallbackExecutor=android.os.HandlerExecutor@c014943, getEventListener=com.ticanalyse.lagfo_kotlin.VideoRecorder$$ExternalSyntheticLambda2@db0cbc0, hasAudioEnabled=false, isPersistent=false, getRecordingId=1} at androidx.camera.video.Recorder$RecordingRecord.performOneTimeMediaMuxerCreation(Recorder.java:3067) at androidx.camera.video.Recorder.setupAndStartMediaMuxer(Recorder.java:1464) at androidx.camera.video.Recorder$4.onEncodedData(Recorder.java:1666) at androidx.camera.video.internal.encoder.EncoderImpl$MediaCodecCallback.lambda$sendEncodedData$3(EncoderImpl.java:1227) at androidx.camera.video.internal.encoder.EncoderImpl$MediaCodecCallback$$ExternalSyntheticLambda10.run(Unknown Source:4) at androidx.camera.core.impl.utils.executor.SequentialExecutor$1.run(SequentialExecutor.java:111) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:231) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:173) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923)