From 3c027896fc2c1f8b1bac21d516d951f7a13b23c4 Mon Sep 17 00:00:00 2001 From: "daniel.roek" Date: Thu, 17 Dec 2020 15:11:03 +0100 Subject: [PATCH 1/6] Fixed stale images in imageStream subscriptions --- packages/camera/camera/CHANGELOG.md | 4 ++++ .../src/main/java/io/flutter/plugins/camera/Camera.java | 3 +++ packages/camera/camera/pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 8a7c979c3b72..43c1701c1e60 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.0+2 + +Set ImageStreamReader listener to null to prevent stale images when streaming images. + ## 0.6.0+1 Updated README to inform users that iOS 10.0+ is needed for use diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 306dd447cfb9..137095830f93 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -454,6 +454,9 @@ public void resumeVideoRecording(@NonNull final Result result) { public void startPreview() throws CameraAccessException { if (pictureImageReader == null || pictureImageReader.getSurface() == null) return; + if (imageStreamReader != null) { + imageStreamReader.setOnImageAvailableListener(null, null); + } createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, pictureImageReader.getSurface()); } diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index cc25133f95f9..3c3e0cea3565 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.6.0+1 +version: 0.6.0+2 homepage: https://github.com/flutter/plugins/tree/master/packages/camera/camera dependencies: From a4545b1f42cace907e717ea8d3bea356c9872001 Mon Sep 17 00:00:00 2001 From: "daniel.roek" Date: Thu, 17 Dec 2020 15:32:26 +0100 Subject: [PATCH 2/6] Implemented feedback --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 9 ++++++--- .../io/flutter/plugins/camera/MethodCallHandlerImpl.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 137095830f93..8e9e08a98f2e 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -454,9 +454,6 @@ public void resumeVideoRecording(@NonNull final Result result) { public void startPreview() throws CameraAccessException { if (pictureImageReader == null || pictureImageReader.getSurface() == null) return; - if (imageStreamReader != null) { - imageStreamReader.setOnImageAvailableListener(null, null); - } createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, pictureImageReader.getSurface()); } @@ -512,6 +509,12 @@ private void setImageStreamImageAvailableListener(final EventChannel.EventSink i null); } + public void stopImageStream() throws CameraAccessException { + imageStreamReader.setOnImageAvailableListener(null, null); + startPreview(); + } + + private void closeCaptureSession() { if (cameraCaptureSession != null) { cameraCaptureSession.close(); diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index 6c2e65e76f9e..16f8d363e8a7 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -135,7 +135,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) case "stopImageStream": { try { - camera.startPreview(); + camera.stopImageStream(); result.success(null); } catch (Exception e) { handleException(e, result); From c0f89441be6506db797e9a24500fafb38946cdde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl?= <32639467+danielroek@users.noreply.github.com> Date: Thu, 17 Dec 2020 19:37:41 +0100 Subject: [PATCH 3/6] Fixed format exception --- .../android/src/main/java/io/flutter/plugins/camera/Camera.java | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 8e9e08a98f2e..11f8f8ee1956 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -514,7 +514,6 @@ public void stopImageStream() throws CameraAccessException { startPreview(); } - private void closeCaptureSession() { if (cameraCaptureSession != null) { cameraCaptureSession.close(); From a5227bd5c477e50843ab2460f0340a154112a1ec Mon Sep 17 00:00:00 2001 From: "daniel.roek" Date: Thu, 17 Dec 2020 20:08:17 +0100 Subject: [PATCH 4/6] added null-check for imageStreamReader --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 8e9e08a98f2e..66a54f82defa 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -510,7 +510,9 @@ private void setImageStreamImageAvailableListener(final EventChannel.EventSink i } public void stopImageStream() throws CameraAccessException { - imageStreamReader.setOnImageAvailableListener(null, null); + if(imageStreamReader != null) { + imageStreamReader.setOnImageAvailableListener(null, null); + } startPreview(); } From df72d6d3490e259797c526d345a49fb213fa2a1e Mon Sep 17 00:00:00 2001 From: "daniel.roek" Date: Fri, 18 Dec 2020 10:43:23 +0100 Subject: [PATCH 5/6] Removed setOnImageAvailableListener from onCancel --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 66a54f82defa..871da2115908 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -470,9 +470,7 @@ public void onListen(Object o, EventChannel.EventSink imageStreamSink) { } @Override - public void onCancel(Object o) { - imageStreamReader.setOnImageAvailableListener(null, null); - } + public void onCancel(Object o) {} }); } From db4a245dd3e8a921cba460e6b50c25ec6b8676c0 Mon Sep 17 00:00:00 2001 From: "daniel.roek" Date: Fri, 18 Dec 2020 11:04:23 +0100 Subject: [PATCH 6/6] fixed formatting --- .../android/src/main/java/io/flutter/plugins/camera/Camera.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 7b5c6b8362ac..a792ac20bd01 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -508,7 +508,7 @@ private void setImageStreamImageAvailableListener(final EventChannel.EventSink i } public void stopImageStream() throws CameraAccessException { - if(imageStreamReader != null) { + if (imageStreamReader != null) { imageStreamReader.setOnImageAvailableListener(null, null); } startPreview();