Skip to content

Commit dda93a2

Browse files
added camera face android
1 parent cc6ac64 commit dda93a2

File tree

13 files changed

+106
-27
lines changed

13 files changed

+106
-27
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 2.0.0
2+
* `SimpleBarcodeScannerPage` is now depreciated, use `SimpleBarcodeScanner` instead
3+
* Scan barcode with `SimpleBarcodeScanner` `scanBarcode` method
4+
* Stream barcode with `SimpleBarcodeScanner` `streamBarcode` method
5+
* Added `cameraFace` to switch between front and back camera,works only on android
6+
* Updated example page
7+
18
## 0.1.9
29
* `SimpleBarcodeScannerPage` is now depreciated, use `SimpleBarcodeScanner` instead
310
* Scan barcode with `SimpleBarcodeScanner` `scanBarcode` method

README.md

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,47 @@ import 'package:simple_barcode_scanner/simple_barcode_scanner.dart';
4242
4343
```
4444
## Usage
45-
45+
1. To scan barcode
4646
```dart
4747
ElevatedButton(
4848
onPressed: () async {
49-
var res = await Navigator.push(
49+
50+
String? res = await SimpleBarcodeScanner.scanBarcode(
5051
context,
51-
MaterialPageRoute(
52-
builder: (context) => const SimpleBarcodeScannerPage(),
53-
));
54-
setState(() {
55-
if (res is String) {
56-
result = res;
57-
}
52+
barcodeAppBar: const BarcodeAppBar(
53+
appBarTitle: 'Test',
54+
centerTitle: false,
55+
enableBackButton: true,
56+
backButtonIcon: Icon(Icons.arrow_back_ios),
57+
),
58+
isShowFlashIcon: true,
59+
delayMillis: 2000,
60+
cameraFace: CameraFace.front,
61+
);
62+
setState(() {
63+
result = res as String;
64+
});
65+
},
66+
child: const Text('Open Scanner'),
67+
)
68+
```
69+
2. To stream barcode
70+
```dart
71+
ElevatedButton(
72+
onPressed: () async {
73+
74+
SimpleBarcodeScanner.streamBarcode(
75+
context,
76+
barcodeAppBar: const BarcodeAppBar(
77+
appBarTitle: 'Test',
78+
centerTitle: false,
79+
enableBackButton: true,
80+
backButtonIcon: Icon(Icons.arrow_back_ios),
81+
),
82+
isShowFlashIcon: true,
83+
delayMillis: 2000,
84+
).listen((event) {
85+
print("Stream Barcode Result: $event");
5886
});
5987
},
6088
child: const Text('Open Scanner'),
@@ -66,7 +94,8 @@ import 'package:simple_barcode_scanner/simple_barcode_scanner.dart';
6694

6795
## Note
6896
Feel free to fork and send pull request.
69-
If you have any questions, feedback or ideas,You can [create an
97+
* iOS support may be delayed as I currently do not have access to an iOS device for testing. Contributions and testing help from the community are welcome!
98+
* If you have any questions, feedback or ideas,You can [create an
7099
issue](https://github.com/CodingWithTashi/simple_barcode_scanner/issues/new). If you enjoy this
71100
project, I'd appreciate your [🌟 on GitHub](https://github.com/CodingWithTashi/simple_barcode_scanner/).
72101

android/src/main/java/com/amolg/flutterbarcodescanner/BarcodeCaptureActivity.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.google.android.gms.vision.barcode.BarcodeDetector;
5858

5959
import java.io.IOException;
60+
import java.util.Objects;
6061

6162
/**
6263
* Activity for the multi-tracker app. This app detects barcodes and displays the value with the
@@ -86,7 +87,7 @@ public final class BarcodeCaptureActivity extends AppCompatActivity implements B
8687
private ImageView imgViewSwitchCamera;
8788

8889
public static int SCAN_MODE = SCAN_MODE_ENUM.QR.ordinal();
89-
90+
private int cameraFacing = CameraSource.CAMERA_FACING_BACK;
9091
public enum SCAN_MODE_ENUM {
9192
QR,
9293
BARCODE,
@@ -121,8 +122,10 @@ public void onCreate(Bundle icicle) {
121122
setContentView(R.layout.barcode_capture);
122123

123124
String buttonText = "";
125+
String cameraFacingText = "";
124126
try {
125127
buttonText = (String) getIntent().getStringExtra("cancelButtonText");
128+
cameraFacingText = (String) getIntent().getStringExtra("cameraFacingText");
126129
} catch (Exception e) {
127130
buttonText = "Cancel";
128131
Log.e("BCActivity:onCreate()", "onCreate: " + e.getLocalizedMessage());
@@ -145,12 +148,13 @@ public void onCreate(Bundle icicle) {
145148
// read parameters from the intent used to launch the activity.
146149
boolean autoFocus = true;
147150
boolean useFlash = false;
151+
cameraFacing = Objects.equals(cameraFacingText, "FRONT") ?CameraSource.CAMERA_FACING_FRONT:CameraSource.CAMERA_FACING_BACK;
148152

149153
// Check for the camera permission before accessing the camera. If the
150154
// permission is not granted yet, request permission.
151155
int rc = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
152156
if (rc == PackageManager.PERMISSION_GRANTED) {
153-
createCameraSource(autoFocus, useFlash, CameraSource.CAMERA_FACING_BACK);
157+
createCameraSource(autoFocus, useFlash, cameraFacing);
154158
} else {
155159
requestCameraPermission();
156160
}
@@ -321,7 +325,7 @@ public void onRequestPermissionsResult(int requestCode,
321325
// we have permission, so create the camerasource
322326
boolean autoFocus = true;
323327
boolean useFlash = false;
324-
createCameraSource(autoFocus, useFlash, CameraSource.CAMERA_FACING_BACK);
328+
createCameraSource(autoFocus, useFlash, cameraFacing);
325329
return;
326330
}
327331

@@ -429,10 +433,10 @@ public void onClick(View v) {
429433
onBackPressed();
430434

431435
} else if (i == R.id.imgViewSwitchCamera) {
432-
int currentFacing = mCameraSource.getCameraFacing();
436+
cameraFacing = mCameraSource.getCameraFacing();
433437
boolean autoFocus = mCameraSource.getFocusMode() != null;
434438
boolean useFlash = flashStatus == USE_FLASH.ON.ordinal();
435-
createCameraSource(autoFocus, useFlash, getInverseCameraFacing(currentFacing));
439+
createCameraSource(autoFocus, useFlash, getInverseCameraFacing(cameraFacing));
436440
startCameraSource();
437441
}
438442
}

android/src/main/java/com/amolg/flutterbarcodescanner/FlutterBarcodeScannerPlugin.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class FlutterBarcodeScannerPlugin implements MethodCallHandler, ActivityR
4848
public static String lineColor = "";
4949
public static boolean isShowFlashIcon = false;
5050
public static boolean isContinuousScan = false;
51+
public static String cameraFacingText = "";
5152
public static int delayMillis = 0;
5253
static EventChannel.EventSink barcodeStream;
5354
private EventChannel eventChannel;
@@ -116,21 +117,24 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
116117

117118
isContinuousScan = (boolean) arguments.get("isContinuousScan");
118119

120+
cameraFacingText = (String) arguments.get("cameraFacingText");
121+
119122
if (null != arguments.get("delayMillis"))
120123
delayMillis = (int) arguments.get("delayMillis");
121124

122125

123-
startBarcodeScannerActivityView((String) arguments.get("cancelButtonText"), isContinuousScan);
126+
startBarcodeScannerActivityView((String) arguments.get("cancelButtonText"), isContinuousScan,cameraFacingText);
124127
}
125128
} catch (Exception e) {
126129
Log.e(TAG, "onMethodCall: " + e.getLocalizedMessage());
127130
}
128131
}
129132

130-
private void startBarcodeScannerActivityView(String buttonText, boolean isContinuousScan) {
133+
private void startBarcodeScannerActivityView(String buttonText, boolean isContinuousScan, String cameraFacingText) {
131134
try {
132135
Intent intent = new Intent(activity, BarcodeCaptureActivity.class).putExtra("cancelButtonText", buttonText)
133-
.putExtra("delayMillis", delayMillis);
136+
.putExtra("delayMillis", delayMillis)
137+
.putExtra("cameraFacingText", cameraFacingText);
134138
if (isContinuousScan) {
135139
activity.startActivity(intent);
136140
} else {

example/lib/main.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class _HomePageState extends State<HomePage> {
4949
),
5050
isShowFlashIcon: true,
5151
delayMillis: 2000,
52+
cameraFace: CameraFace.front,
5253
);
5354
setState(() {
5455
result = res as String;

lib/enum.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
enum ScanType { qr, barcode, defaultMode }
2+
3+
enum CameraFace { back, front }

lib/flutter_barcode_scanner.dart

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,13 @@ class FlutterBarcodeScanner {
2525
/// Shows a scan line with [lineColor] over a scan window. A flash icon is
2626
/// displayed if [isShowFlashIcon] is true. The text of the cancel button can
2727
/// be customized with the [cancelButtonText] string.
28-
static Future<String> scanBarcode(String lineColor, String cancelButtonText,
29-
bool isShowFlashIcon, ScanMode scanMode, int? delayMillis) async {
28+
static Future<String> scanBarcode(
29+
String lineColor,
30+
String cancelButtonText,
31+
bool isShowFlashIcon,
32+
ScanMode scanMode,
33+
int? delayMillis,
34+
String cameraFace) async {
3035
if (cancelButtonText.isEmpty) {
3136
cancelButtonText = 'Cancel';
3237
}
@@ -38,7 +43,8 @@ class FlutterBarcodeScanner {
3843
'isShowFlashIcon': isShowFlashIcon,
3944
'isContinuousScan': false,
4045
'scanMode': scanMode.index,
41-
'delayMillis': delayMillis ?? 0
46+
'delayMillis': delayMillis ?? 0,
47+
'cameraFacingText': cameraFace
4248
};
4349

4450
/// Get barcode scan result
@@ -59,7 +65,8 @@ class FlutterBarcodeScanner {
5965
String cancelButtonText,
6066
bool isShowFlashIcon,
6167
ScanMode scanMode,
62-
int? delayMillis) {
68+
int? delayMillis,
69+
String cameraFace) {
6370
if (cancelButtonText.isEmpty) {
6471
cancelButtonText = 'Cancel';
6572
}
@@ -71,7 +78,8 @@ class FlutterBarcodeScanner {
7178
'isShowFlashIcon': isShowFlashIcon,
7279
'isContinuousScan': true,
7380
'scanMode': scanMode.index,
74-
'delayMillis': delayMillis ?? 0
81+
'delayMillis': delayMillis ?? 0,
82+
'cameraFacingText': cameraFace
7583
};
7684

7785
// Invoke method to open camera, and then create an event channel which will

lib/screens/io_device.dart

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class BarcodeScanner extends StatelessWidget {
1414
final String cancelButtonText;
1515
final bool isShowFlashIcon;
1616
final ScanType scanType;
17+
final CameraFace cameraFace;
1718
final Function(String) onScanned;
1819
final String? appBarTitle;
1920
final bool? centerTitle;
@@ -27,6 +28,7 @@ class BarcodeScanner extends StatelessWidget {
2728
required this.cancelButtonText,
2829
required this.isShowFlashIcon,
2930
required this.scanType,
31+
this.cameraFace = CameraFace.back,
3032
required this.onScanned,
3133
this.child,
3234
this.appBarTitle,
@@ -79,14 +81,25 @@ class BarcodeScanner extends StatelessWidget {
7981

8082
_scanBarcodeForMobileAndTabDevices(ScanMode scanMode) async {
8183
String barcode = await FlutterBarcodeScanner.scanBarcode(
82-
lineColor, cancelButtonText, isShowFlashIcon, scanMode, delayMillis);
84+
lineColor,
85+
cancelButtonText,
86+
isShowFlashIcon,
87+
scanMode,
88+
delayMillis,
89+
cameraFace.name.toUpperCase(),
90+
);
8391
onScanned(barcode);
8492
}
8593

8694
void _streamBarcodeForMobileAndTabDevices(ScanMode scanMode) {
8795
FlutterBarcodeScanner.getBarcodeStreamReceiver(
88-
lineColor, cancelButtonText, isShowFlashIcon, scanMode, delayMillis)
89-
?.listen((barcode) {
96+
lineColor,
97+
cancelButtonText,
98+
isShowFlashIcon,
99+
scanMode,
100+
delayMillis,
101+
cameraFace.name.toUpperCase(),
102+
)?.listen((barcode) {
90103
if (barcode != null) {
91104
barcode == kCancelValue ? onClose?.call() : onScanned(barcode);
92105
}

lib/screens/unsupported.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class BarcodeScanner extends StatelessWidget {
77
final String cancelButtonText;
88
final bool isShowFlashIcon;
99
final ScanType scanType;
10+
final CameraFace cameraFace;
1011
final Function(String) onScanned;
1112
final String? appBarTitle;
1213
final bool? centerTitle;
@@ -20,6 +21,7 @@ class BarcodeScanner extends StatelessWidget {
2021
this.cancelButtonText = "Cancel",
2122
this.isShowFlashIcon = false,
2223
this.scanType = ScanType.barcode,
24+
this.cameraFace = CameraFace.back,
2325
required this.onScanned,
2426
this.appBarTitle,
2527
this.child,

lib/screens/web.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class BarcodeScanner extends StatelessWidget {
1414
final String cancelButtonText;
1515
final bool isShowFlashIcon;
1616
final ScanType scanType;
17+
final CameraFace cameraFace;
1718
final Function(String) onScanned;
1819
final String? appBarTitle;
1920
final bool? centerTitle;
@@ -28,6 +29,7 @@ class BarcodeScanner extends StatelessWidget {
2829
required this.cancelButtonText,
2930
required this.isShowFlashIcon,
3031
required this.scanType,
32+
this.cameraFace = CameraFace.back,
3133
required this.onScanned,
3234
this.appBarTitle,
3335
this.centerTitle,

0 commit comments

Comments
 (0)