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