Skip to content

Erro ao abrir câmera para gravar vídeo no Moto G Android 6.0

Estou tentando chamar a câmera em modo de vídeo no Moto G Edição Turbo com Android 6.0, mas sem sucesso. No caso, estou com dois problemas:

  • Ao chamar a câmera em modo Nativo, mesmo setando a opção de Vídeo com Áudio, o sistema abre a câmera em modo Foto
  • Ao chamar a câmera em modo Custom, quando clico no botão Start, o programa sofre crash

Minha dúvida é se existe alguma forma de forçar a câmera nativa a entrar em modo vídeo ou, caso seja obrigado a usar a câmera Custom, o que pode ser feito com relação ao erro que está ocorrendo.

Fiz um código de exemplo que reproduz exatamente os problemas supracitados:

Button btnCameraVideoOnly;
Button btnCamera;
Button btnNativeCameraVideoOnly;
Button btnNativeCamera;

@Override
public void initUI() {
	Button btnExit = new Button("Exit");
	btnExit.paddingLeft = btnExit.paddingRight = 20;
	btnExit.paddingTop = btnExit.paddingBottom = 10;
	btnExit.addPressListener(e -> MainWindow.exit(0));
	add(btnExit, CENTER, CENTER);
	
	btnCameraVideoOnly = new Button("Open Camera w/o Audio");
	btnCameraVideoOnly.paddingLeft = btnExit.paddingRight = 20;
	btnCameraVideoOnly.paddingTop = btnExit.paddingBottom = 10;
	add(btnCameraVideoOnly, CENTER, BEFORE-4);
	
	btnCamera = new Button("Open Camera w/ Audio");
	btnCamera.paddingLeft = btnExit.paddingRight = 20;
	btnCamera.paddingTop = btnExit.paddingBottom = 10;
	add(btnCamera, CENTER, BEFORE-4);
	
	btnNativeCameraVideoOnly = new Button("Open Native Camera w/o Audio");
	btnNativeCameraVideoOnly.paddingLeft = btnExit.paddingRight = 20;
	btnNativeCameraVideoOnly.paddingTop = btnExit.paddingBottom = 10;
	add(btnNativeCameraVideoOnly, CENTER, BEFORE-4);
	
	btnNativeCamera = new Button("Open Native Camera w/ Audio");
	btnNativeCamera.paddingLeft = btnExit.paddingRight = 20;
	btnNativeCamera.paddingTop = btnExit.paddingBottom = 10;
	add(btnNativeCamera, CENTER, BEFORE-4);
}

@Override
public <H extends EventHandler> void onEvent(Event<H> event) {
	try {
		if (event.type == ControlEvent.PRESSED) {
			if (event.target == btnCameraVideoOnly) {
				Camera camera           = new Camera();
				camera.cameraType       = totalcross.ui.media.Camera.CAMERA_CUSTOM;
				camera.captureMode      = totalcross.ui.media.Camera.CAMERACAPTURE_MODE_VIDEOONLY;
				camera.click();
			}
			else if (event.target ==  btnCamera) {
				Camera camera           = new Camera();
				camera.cameraType       = totalcross.ui.media.Camera.CAMERA_CUSTOM;
				camera.captureMode      = totalcross.ui.media.Camera.CAMERACAPTURE_MODE_VIDEOWITHAUDIO;
				camera.click();
			}
			else if (event.target == btnNativeCameraVideoOnly) {
				Camera camera           = new Camera();
				camera.cameraType       = totalcross.ui.media.Camera.CAMERA_NATIVE;
				camera.captureMode      = totalcross.ui.media.Camera.CAMERACAPTURE_MODE_VIDEOONLY;
				camera.click();
			}
			else if (event.target == btnNativeCamera) {
				Camera camera           = new Camera();
				camera.cameraType       = totalcross.ui.media.Camera.CAMERA_NATIVE;
				camera.captureMode      = totalcross.ui.media.Camera.CAMERACAPTURE_MODE_VIDEOWITHAUDIO;
				camera.click();
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

Abaixo segue o logcat quando clico em Start na câmera Custom. O erro é o mesmo, independente se é vídeo com áudio ou sem áudio, por isso tem o erro duas vezes no log abaixo, pois primeiro cliquei no botão de vídeo sem áudio, depois no botão de vídeo com áudio.

12-13 12:07:03.476 26122 26122 I TotalCross: Taking photo 0x0 from CUSTOM
12-13 12:07:03.488 26122 26122 I TotalCross: Launched photo
12-13 12:07:06.184 26122 26122 I TotalCross: NON-FATAL EXCEPTION
12-13 12:07:06.184 26122 26122 I TotalCross: java.lang.RuntimeException: setAudioSource failed.
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.media.MediaRecorder.setAudioSource(Native Method)
12-13 12:07:06.184 26122 26122 I TotalCross:    at totalcross.appriri.CameraViewer.startRecording(CameraViewer.java:206)
12-13 12:07:06.184 26122 26122 I TotalCross:    at totalcross.appriri.CameraViewer.access$300(CameraViewer.java:37)
12-13 12:07:06.184 26122 26122 I TotalCross:    at totalcross.appriri.CameraViewer$2.onClick(CameraViewer.java:299)
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.view.View.performClick(View.java:5201)
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.view.View$PerformClick.run(View.java:21163)
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.os.Handler.handleCallback(Handler.java:746)
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.os.Handler.dispatchMessage(Handler.java:95)
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.os.Looper.loop(Looper.java:148)
12-13 12:07:06.184 26122 26122 I TotalCross:    at android.app.ActivityThread.main(ActivityThread.java:5443)
12-13 12:07:06.184 26122 26122 I TotalCross:    at java.lang.reflect.Method.invoke(Native Method)
12-13 12:07:06.184 26122 26122 I TotalCross:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
12-13 12:07:06.184 26122 26122 I TotalCross:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
12-13 12:07:06.547 26122 26141 I TotalCross: glError INVALID OPERATION at P:\Jenkins\jobs\Android\workspace\TotalCross\TotalCrossVM\src\nm\ui\android/gfx_Graphics_c.h (251)
12-13 12:07:10.469 26876 26895 I TotalCross: !erase debug!
12-13 12:07:10.719 26876 26899 I TotalCross: /sdcard0: /storage/emulated/0 (valid)
12-13 12:07:11.960 26876 26876 I TotalCross: Taking photo 0x0 from CUSTOM
12-13 12:07:11.973 26876 26876 I TotalCross: Launched photo
12-13 12:07:13.771 26876 26876 I TotalCross: NON-FATAL EXCEPTION
12-13 12:07:13.771 26876 26876 I TotalCross: java.lang.RuntimeException: setAudioSource failed.
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.media.MediaRecorder.setAudioSource(Native Method)
12-13 12:07:13.771 26876 26876 I TotalCross:    at totalcross.appriri.CameraViewer.startRecording(CameraViewer.java:206)
12-13 12:07:13.771 26876 26876 I TotalCross:    at totalcross.appriri.CameraViewer.access$300(CameraViewer.java:37)
12-13 12:07:13.771 26876 26876 I TotalCross:    at totalcross.appriri.CameraViewer$2.onClick(CameraViewer.java:299)
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.view.View.performClick(View.java:5201)
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.view.View$PerformClick.run(View.java:21163)
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.os.Handler.handleCallback(Handler.java:746)
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.os.Handler.dispatchMessage(Handler.java:95)
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.os.Looper.loop(Looper.java:148)
12-13 12:07:13.771 26876 26876 I TotalCross:    at android.app.ActivityThread.main(ActivityThread.java:5443)
12-13 12:07:13.771 26876 26876 I TotalCross:    at java.lang.reflect.Method.invoke(Native Method)
12-13 12:07:13.771 26876 26876 I TotalCross:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
12-13 12:07:13.771 26876 26876 I TotalCross:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
12-13 12:07:14.009 26876 26895 I TotalCross: glError INVALID OPERATION at P:\Jenkins\jobs\Android\workspace\TotalCross\TotalCrossVM\src\nm\ui\android/gfx_Graphics_c.h (251)

Versão do TotalCross: 5.1.3

Edited by Felipe Dias