Skip to content

Commit 8ec48ab

Browse files
authored
[camera] Add API support query for image streaming (app-facing) (#8422)
Final step for introducing the `supportsImageStreaming` query method. Expose it through `CameraController`. Previous steps: - #8250 - #8307
1 parent fba4a18 commit 8ec48ab

File tree

5 files changed

+40
-20
lines changed

5 files changed

+40
-20
lines changed

packages/camera/camera/CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
## NEXT
1+
## 0.11.1
22

3-
* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4.
3+
* Adds API support query for image streaming.
4+
* Updates minimum supported SDK version to Flutter 3.27/Dart 3.6.
45
* Updates example to dispose animation controllers and curved animations.
56

67
## 0.11.0+2

packages/camera/camera/lib/src/camera_controller.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -480,13 +480,12 @@ class CameraController extends ValueNotifier<CameraValue> {
480480
/// Throws a [CameraException] if image streaming or video recording has
481481
/// already started.
482482
///
483-
/// The `startImageStream` method is only available on Android and iOS (other
484-
/// platforms won't be supported in current setup).
483+
/// The `startImageStream` method is only available on platforms that
484+
/// report support for image streaming via [supportsImageStreaming].
485485
///
486486
// TODO(bmparr): Add settings for resolution and fps.
487487
Future<void> startImageStream(onLatestImageAvailable onAvailable) async {
488-
assert(defaultTargetPlatform == TargetPlatform.android ||
489-
defaultTargetPlatform == TargetPlatform.iOS);
488+
assert(supportsImageStreaming());
490489
_throwIfNotInitialized('startImageStream');
491490
if (value.isRecordingVideo) {
492491
throw CameraException(
@@ -518,11 +517,10 @@ class CameraController extends ValueNotifier<CameraValue> {
518517
/// Throws a [CameraException] if image streaming was not started or video
519518
/// recording was started.
520519
///
521-
/// The `stopImageStream` method is only available on Android and iOS (other
522-
/// platforms won't be supported in current setup).
520+
/// The `stopImageStream` method is only available on platforms that
521+
/// report support for image streaming via [supportsImageStreaming].
523522
Future<void> stopImageStream() async {
524-
assert(defaultTargetPlatform == TargetPlatform.android ||
525-
defaultTargetPlatform == TargetPlatform.iOS);
523+
assert(supportsImageStreaming());
526524
_throwIfNotInitialized('stopImageStream');
527525
if (!value.isStreamingImages) {
528526
throw CameraException(
@@ -871,6 +869,10 @@ class CameraController extends ValueNotifier<CameraValue> {
871869
}
872870
}
873871

872+
/// Check whether the camera platform supports image streaming.
873+
bool supportsImageStreaming() =>
874+
CameraPlatform.instance.supportsImageStreaming();
875+
874876
/// Releases the resources of this camera.
875877
@override
876878
Future<void> dispose() async {

packages/camera/camera/pubspec.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ description: A Flutter plugin for controlling the camera. Supports previewing
44
Dart.
55
repository: https://github.com/flutter/packages/tree/main/packages/camera/camera
66
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
7-
version: 0.11.0+2
7+
version: 0.11.1
88

99
environment:
10-
sdk: ^3.4.0
11-
flutter: ">=3.22.0"
10+
sdk: ^3.6.0
11+
flutter: ">=3.27.0"
1212

1313
flutter:
1414
plugin:
@@ -21,9 +21,9 @@ flutter:
2121
default_package: camera_web
2222

2323
dependencies:
24-
camera_android_camerax: ^0.6.5
25-
camera_avfoundation: ^0.9.15
26-
camera_platform_interface: ^2.6.0
24+
camera_android_camerax: ^0.6.13
25+
camera_avfoundation: ^0.9.18
26+
camera_platform_interface: ^2.9.0
2727
camera_web: ^0.3.3
2828
flutter:
2929
sdk: flutter

packages/camera/camera/test/camera_image_stream_test.dart

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,11 @@ void main() {
100100

101101
await cameraController.startImageStream((CameraImage image) {});
102102

103-
expect(mockPlatform.streamCallLog,
104-
<String>['onStreamedFrameAvailable', 'listen']);
103+
expect(mockPlatform.streamCallLog, <String>[
104+
'supportsImageStreaming',
105+
'onStreamedFrameAvailable',
106+
'listen'
107+
]);
105108
});
106109

107110
test('stopImageStream() throws $CameraException when uninitialized', () {
@@ -160,8 +163,13 @@ void main() {
160163
await cameraController.startImageStream((CameraImage image) {});
161164
await cameraController.stopImageStream();
162165

163-
expect(mockPlatform.streamCallLog,
164-
<String>['onStreamedFrameAvailable', 'listen', 'cancel']);
166+
expect(mockPlatform.streamCallLog, <String>[
167+
'supportsImageStreaming',
168+
'onStreamedFrameAvailable',
169+
'listen',
170+
'supportsImageStreaming',
171+
'cancel'
172+
]);
165173
});
166174

167175
test('startVideoRecording() can stream images', () async {
@@ -235,6 +243,12 @@ class MockStreamingCameraPlatform extends MockCameraPlatform {
235243
streamCallLog.add('listen');
236244
}
237245

246+
@override
247+
bool supportsImageStreaming() {
248+
streamCallLog.add('supportsImageStreaming');
249+
return true;
250+
}
251+
238252
FutureOr<void> _onFrameStreamCancel() async {
239253
streamCallLog.add('cancel');
240254
_streamController = null;

packages/camera/camera/test/camera_preview_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ class FakeController extends ValueNotifier<CameraValue>
132132

133133
@override
134134
CameraDescription get description => value.description;
135+
136+
@override
137+
bool supportsImageStreaming() => true;
135138
}
136139

137140
void main() {

0 commit comments

Comments
 (0)