Skip to content

Commit aa9b4c5

Browse files
BeMacizedMinyewoo
authored andcommitted
[camera] Add implementations for the torch flash mode. (flutter#3338)
* Added torch mode functionality for Android and iOS. * Format objective c code
1 parent c6bc703 commit aa9b4c5

File tree

6 files changed

+56
-41
lines changed

6 files changed

+56
-41
lines changed

packages/camera/camera/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
## 0.6.2+1
3+
24

35

46

packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,9 @@ public void setFlashMode(@NonNull final Result result, FlashMode mode)
537537
throws CameraAccessException {
538538
// Get the flash availability
539539
Boolean flashAvailable =
540-
cameraManager
541-
.getCameraCharacteristics(cameraDevice.getId())
542-
.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
540+
cameraManager
541+
.getCameraCharacteristics(cameraDevice.getId())
542+
.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
543543

544544
// Check if flash is available.
545545
if (flashAvailable == null || !flashAvailable) {
@@ -771,7 +771,7 @@ private void initPreviewCaptureBuilder() {
771771
if (aeMeteringRectangle != null) {
772772
captureRequestBuilder.set(
773773
CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[] {aeMeteringRectangle});
774-
}
774+
}
775775
switch (exposureMode) {
776776
case locked:
777777
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);

packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/types/FlashMode.java

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

33
// Mirrors flash_mode.dart
44
public enum FlashMode {
5+
56
off("off"),
67
auto("auto"),
78
always("always"),
@@ -17,8 +18,8 @@ public static FlashMode getValueForString(String modeStr) {
1718
for (FlashMode value : values()) {
1819
if (value.strValue.equals(modeStr)) return value;
1920
}
20-
return null;
21-
}
21+
return null;
22+
}
2223

2324
@Override
2425
public String toString() {

packages/camera/camera/example/lib/main.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,15 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
245245
? () => onFlashModeButtonPressed(FlashMode.always)
246246
: null,
247247
),
248+
IconButton(
249+
icon: const Icon(Icons.highlight),
250+
color: controller?.value?.flashMode == FlashMode.torch
251+
? Colors.orange
252+
: Colors.blue,
253+
onPressed: controller != null
254+
? () => onFlashModeButtonPressed(FlashMode.torch)
255+
: null,
256+
),
248257
],
249258
);
250259
}

packages/camera/camera/ios/Classes/CameraPlugin.m

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,17 @@ static FlashMode getFlashModeForString(NSString *mode) {
163163
}
164164

165165
static AVCaptureFlashMode getAVCaptureFlashModeForFlashMode(FlashMode mode) {
166-
switch (mode) {
167-
case FlashModeOff:
168-
return AVCaptureFlashModeOff;
169-
case FlashModeAuto:
170-
return AVCaptureFlashModeAuto;
171-
case FlashModeAlways:
172-
return AVCaptureFlashModeOn;
173-
case FlashModeTorch:
174-
default:
175-
return -1;
176-
}
166+
switch (mode) {
167+
case FlashModeOff:
168+
return AVCaptureFlashModeOff;
169+
case FlashModeAuto:
170+
return AVCaptureFlashModeAuto;
171+
case FlashModeAlways:
172+
return AVCaptureFlashModeOn;
173+
case FlashModeTorch:
174+
default:
175+
return -1;
176+
}
177177
}
178178

179179
// Mirrors ExposureMode in camera.dart
@@ -372,6 +372,7 @@ - (void)captureToFile:(FlutterResult)result API_AVAILABLE(ios(10)) {
372372
[settings setHighResolutionPhotoEnabled:YES];
373373
}
374374

375+
375376
AVCaptureFlashMode avFlashMode = getAVCaptureFlashModeForFlashMode(_flashMode);
376377
if (avFlashMode != -1) {
377378
[settings setFlashMode:avFlashMode];
@@ -773,6 +774,7 @@ - (void)setFlashModeWithResult:(FlutterResult)result mode:(NSString *)modeStr {
773774
result(getFlutterError(e));
774775
return;
775776
}
777+
776778
if (mode == FlashModeTorch) {
777779
if (!_captureDevice.hasTorch) {
778780
result([FlutterError errorWithCode:@"setFlashModeFailed"
@@ -793,26 +795,26 @@ - (void)setFlashModeWithResult:(FlutterResult)result mode:(NSString *)modeStr {
793795
}
794796
}
795797
else {
796-
if (!_captureDevice.hasFlash) {
797-
result([FlutterError errorWithCode:@"setFlashModeFailed"
798-
message:@"Device does not have flash capabilities"
799-
details:nil]);
800-
return;
801-
}
802-
AVCaptureFlashMode avFlashMode = getAVCaptureFlashModeForFlashMode(mode);
803-
if (![_capturePhotoOutput.supportedFlashModes
804-
containsObject:[NSNumber numberWithInt:((int)avFlashMode)]]) {
805-
result([FlutterError errorWithCode:@"setFlashModeFailed"
806-
message:@"Device does not support this specific flash mode"
807-
details:nil]);
808-
return;
809-
}
810-
if (_captureDevice.torchMode != AVCaptureTorchModeOff) {
811-
[_captureDevice lockForConfiguration:nil];
812-
[_captureDevice setTorchMode:AVCaptureTorchModeOff];
813-
[_captureDevice unlockForConfiguration];
814-
}
798+
if (!_captureDevice.hasFlash) {
799+
result([FlutterError errorWithCode:@"setFlashModeFailed"
800+
message:@"Device does not have flash capabilities"
801+
details:nil]);
802+
return;
803+
}
804+
AVCaptureFlashMode avFlashMode = getAVCaptureFlashModeForFlashMode(mode);
805+
if (![_capturePhotoOutput.supportedFlashModes
806+
containsObject:[NSNumber numberWithInt:((int)avFlashMode)]]) {
807+
result([FlutterError errorWithCode:@"setFlashModeFailed"
808+
message:@"Device does not support this specific flash mode"
809+
details:nil]);
810+
return;
811+
}
812+
if (_captureDevice.torchMode != AVCaptureTorchModeOff) {
813+
[_captureDevice lockForConfiguration:nil];
814+
[_captureDevice setTorchMode:AVCaptureTorchModeOff];
815+
[_captureDevice unlockForConfiguration];
815816
}
817+
}
816818
_flashMode = mode;
817819
result(nil);
818820
}
@@ -1003,11 +1005,11 @@ - (BOOL)setupWriterForPath:(NSString *)path {
10031005
[_audioOutput setSampleBufferDelegate:self queue:_dispatchQueue];
10041006
}
10051007

1006-
if (_flashMode == FlashModeTorch) {
1007-
[self.captureDevice lockForConfiguration:nil];
1008-
[self.captureDevice setTorchMode:AVCaptureTorchModeOn];
1009-
[self.captureDevice unlockForConfiguration];
1010-
}
1008+
if (_flashMode == FlashModeTorch) {
1009+
[self.captureDevice lockForConfiguration:nil];
1010+
[self.captureDevice setTorchMode:AVCaptureTorchModeOn];
1011+
[self.captureDevice unlockForConfiguration];
1012+
}
10111013

10121014
[_videoWriter addInput:_videoWriterInput];
10131015
[_captureVideoOutput setSampleBufferDelegate:self queue:_dispatchQueue];

packages/camera/camera/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ description: A Flutter plugin for getting information about and controlling the
55

66

77

8+
89
version: 0.6.3
910
homepage: https://github.com/flutter/plugins/tree/master/packages/camera/camera
1011
dependencies:

0 commit comments

Comments
 (0)