Android: fix freeze when taking pictures on some devices

On some devices and on the emulator, the preview callback must be
cleared before taking a picture to avoid a camera server freeze.

Task-number: QTBUG-54709
Change-Id: I9e4ad417fa08cddea7edfd232f5b5df40ada59ee
Reviewed-by: Christian Stromme <christian.stromme@qt.io>
This commit is contained in:
Yoann Lopes
2016-07-13 11:15:45 +02:00
parent 624ac719d6
commit 95e1012c9d
2 changed files with 11 additions and 1 deletions

View File

@@ -104,11 +104,16 @@ public class QtCameraListener implements Camera.ShutterCallback,
return m_previewBytesPerLine; return m_previewBytesPerLine;
} }
public void clearPreviewCallback(Camera camera)
{
camera.setPreviewCallbackWithBuffer(null);
}
public void setupPreviewCallback(Camera camera) public void setupPreviewCallback(Camera camera)
{ {
// Clear previous callback (also clears added buffers) // Clear previous callback (also clears added buffers)
clearPreviewCallback(camera);
m_lastPreviewBuffer = null; m_lastPreviewBuffer = null;
camera.setPreviewCallbackWithBuffer(null);
final Camera.Parameters params = camera.getParameters(); final Camera.Parameters params = camera.getParameters();
m_previewSize = params.getPreviewSize(); m_previewSize = params.getPreviewSize();

View File

@@ -1436,6 +1436,11 @@ void AndroidCameraPrivate::takePicture()
{ {
QJNIEnvironmentPrivate env; QJNIEnvironmentPrivate env;
// We must clear the preview callback before calling takePicture(), otherwise the call will
// block and the camera server will be frozen until the next device restart...
// That problem only happens on some devices and on the emulator
m_cameraListener.callMethod<void>("clearPreviewCallback", "(Landroid/hardware/Camera;)V", m_camera.object());
m_camera.callMethod<void>("takePicture", "(Landroid/hardware/Camera$ShutterCallback;" m_camera.callMethod<void>("takePicture", "(Landroid/hardware/Camera$ShutterCallback;"
"Landroid/hardware/Camera$PictureCallback;" "Landroid/hardware/Camera$PictureCallback;"
"Landroid/hardware/Camera$PictureCallback;)V", "Landroid/hardware/Camera$PictureCallback;)V",