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:
@@ -104,11 +104,16 @@ public class QtCameraListener implements Camera.ShutterCallback,
|
||||
return m_previewBytesPerLine;
|
||||
}
|
||||
|
||||
public void clearPreviewCallback(Camera camera)
|
||||
{
|
||||
camera.setPreviewCallbackWithBuffer(null);
|
||||
}
|
||||
|
||||
public void setupPreviewCallback(Camera camera)
|
||||
{
|
||||
// Clear previous callback (also clears added buffers)
|
||||
clearPreviewCallback(camera);
|
||||
m_lastPreviewBuffer = null;
|
||||
camera.setPreviewCallbackWithBuffer(null);
|
||||
|
||||
final Camera.Parameters params = camera.getParameters();
|
||||
m_previewSize = params.getPreviewSize();
|
||||
|
||||
@@ -1436,6 +1436,11 @@ void AndroidCameraPrivate::takePicture()
|
||||
{
|
||||
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;"
|
||||
"Landroid/hardware/Camera$PictureCallback;"
|
||||
"Landroid/hardware/Camera$PictureCallback;)V",
|
||||
|
||||
Reference in New Issue
Block a user