I am developing a video recording application. The moment I start recording a video, the screen hangs for two seconds but it doesn't give an error. I think it could be from the createCaptureSession method. I would be glad if you help. Thank you.
Here I do permissions checks and start recording (checkWriteStoragePermission()). Here I am giving the necessary information for media recorder(setupMediaRecorder()). The method from which the createCaptureSession process begins checkWriteStoragePermission().
public void checkWriteStoragePermission() {
mMediaRecorder = new MediaRecorder();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
try {
createVideoFileName();
} catch (IOException e) {
e.printStackTrace();
}
if (mIsTimelapse || mIsRecording) {
startRecord(true);
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
try {
mMediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
mMediaRecorder.start();
}
} else {
if (activity.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(activity, "app needs to be able to save videos", Toast.LENGTH_SHORT).show();
}
activity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION_RESULT);
}
} else {
try {
createVideoFileName();
} catch (IOException e) {
e.printStackTrace();
}
if (mIsRecording || mIsTimelapse) {
startRecord(true);
mMediaRecorder.start();
}
}
}
private void setupMediaRecorder() throws IOException {
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(mVideoFileName);
mMediaRecorder.setVideoEncodingBitRate(1000000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setOrientationHint(mTotalRotation);
mMediaRecorder.prepare();
}
private void startRecord(Boolean setupMediaControl) {
try {
if (mIsRecording) {
if (setupMediaControl == true) {
setupMediaRecorder();
}
} else if (mIsTimelapse) {
setupTimelapse();
}
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
Surface recordSurface = mMediaRecorder.getSurface();
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mCaptureRequestBuilder.addTarget(previewSurface);
mCaptureRequestBuilder.addTarget(recordSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onClosed(@NonNull CameraCaptureSession session) {
super.onClosed(session);
}
@Override
public void onConfigured(CameraCaptureSession session) {
mRecordCaptureSession = session;
try {
mRecordCaptureSession.setRepeatingRequest(mCaptureRequestBuilder.build(), mPreviewCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@SuppressLint("LongLogTag")
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Log.d(TAG, "onConfigureFailed: startRecord");
}
}, mBackgroundHandler);
} catch (Exception e) {
e.printStackTrace();
}
}