Skip to content

Commit

Permalink
Merge pull request #4 from santetis/fallback-to-error-when-android-ve…
Browse files Browse the repository at this point in the history
…rsion-is-below-21

fallback to error when android version is under 21
  • Loading branch information
jaumard committed Apr 11, 2019
2 parents 209e74d + 39ef072 commit e820b33
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 36 deletions.
6 changes: 4 additions & 2 deletions example/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.santetis.flutter_camera_ml_vision_example">

package="fr.santetis.flutter_camera_ml_vision_example" xmlns:tools="http://schemas.android.com/tools"
>
<uses-sdk tools:overrideLibrary="io.flutter.plugins.camera"/>
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application

android:name="io.flutter.app.FlutterApplication"
android:label="example"
android:icon="@mipmap/ic_launcher">
Expand Down
19 changes: 14 additions & 5 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ packages:
camera:
dependency: transitive
description:
name: camera
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.3+2"
path: "packages/camera"
ref: "feature/camera_api_16_installation"
resolved-ref: a90670a0b60229aa707333e97a352cf2cf5ab050
url: "https://github.com/jaumard/plugins"
source: git
version: "0.4.2"
charcode:
dependency: transitive
description:
Expand All @@ -43,6 +45,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
device_info:
dependency: transitive
description:
name: device_info
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0+1"
firebase_ml_vision:
dependency: transitive
description:
Expand Down Expand Up @@ -172,4 +181,4 @@ packages:
version: "2.0.8"
sdks:
dart: ">=2.1.0 <3.0.0"
flutter: ">=1.2.0 <2.0.0"
flutter: ">=0.2.4 <2.0.0"
80 changes: 57 additions & 23 deletions lib/flutter_camera_ml_vision.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:typed_data';
import 'dart:ui';

import 'package:camera/camera.dart';
import 'package:device_info/device_info.dart';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
Expand All @@ -14,11 +15,17 @@ import 'package:path_provider/path_provider.dart';
part 'utils.dart';

typedef HandleDetection<T> = Future<T> Function(FirebaseVisionImage image);
typedef WidgetBuilder = Widget Function(BuildContext);
typedef Widget ErrorWidgetBuilder(BuildContext context, CameraError error);

enum CameraError {
unknown,
cantInitializeCamera,
androidVersionNotSupported,
noCameraAvailable,
}

enum _CameraState {
loading,
noCamera,
error,
ready,
}
Expand All @@ -27,7 +34,7 @@ class CameraMlVision<T> extends StatefulWidget {
final HandleDetection<T> detector;
final Function(T) onResult;
final WidgetBuilder loadingBuilder;
final WidgetBuilder errorBuilder;
final ErrorWidgetBuilder errorBuilder;

CameraMlVision({
Key key,
Expand All @@ -47,6 +54,7 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
HandleDetection _detector;
ImageRotation _rotation;
_CameraState _cameraMlVisionState = _CameraState.loading;
CameraError _cameraError = CameraError.unknown;
bool _alreadyCheckingImage = false;
bool _isStreaming = false;
bool _isDeactivate = false;
Expand All @@ -61,15 +69,19 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
}

Future<void> stop() async {
if (_lastImage != null && File(_lastImage).existsSync()) {
await File(_lastImage).delete();
}
if(_cameraController != null) {
if (_lastImage != null && File(_lastImage).existsSync()) {
await File(_lastImage).delete();
}

Directory tempDir = await getTemporaryDirectory();
_lastImage = '${tempDir.path}/${DateTime.now().millisecondsSinceEpoch}';
await _cameraController.takePicture(_lastImage);
Directory tempDir = await getTemporaryDirectory();
_lastImage = '${tempDir.path}/${DateTime
.now()
.millisecondsSinceEpoch}';
await _cameraController.takePicture(_lastImage);

await _stop(false);
await _stop(false);
}
}

Future<void> _stop(bool silently) async {
Expand All @@ -87,7 +99,9 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
}

void start() {
_start(false);
if(_cameraController != null) {
_start(false);
}
}

void _start(bool silently) {
Expand All @@ -102,9 +116,24 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
}

Future<void> _initialize() async {
if (Platform.isAndroid) {
final deviceInfo = DeviceInfoPlugin();
final androidInfo = await deviceInfo.androidInfo;
if (androidInfo.version.sdkInt < 21) {
debugPrint('Camera plugin doesn\'t support android under version 21');
setState(() {
_cameraMlVisionState = _CameraState.error;
_cameraError = CameraError.androidVersionNotSupported;
});
return;
}
}

CameraDescription description = await _getCamera(CameraLensDirection.back);
if (description == null) {
_cameraMlVisionState = _CameraState.noCamera;
_cameraMlVisionState = _CameraState.error;
_cameraError = CameraError.noCameraAvailable;

return;
}
_cameraController = CameraController(description,
Expand All @@ -118,11 +147,13 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
} catch (ex, stack) {
setState(() {
_cameraMlVisionState = _CameraState.error;
_cameraError = CameraError.cantInitializeCamera;
});
debugPrint('Can\'t initialize camera');
debugPrint('$ex, $stack');
return;
}

setState(() {
_cameraMlVisionState = _CameraState.ready;
});
Expand All @@ -135,12 +166,14 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {

@override
void deactivate() {
if (_isDeactivate) {
_isDeactivate = false;
_start(true);
} else {
_isDeactivate = true;
_stop(true);
if(_cameraController != null) {
if (_isDeactivate) {
_isDeactivate = false;
_start(true);
} else {
_isDeactivate = true;
_stop(true);
}
}
super.deactivate();
}
Expand All @@ -150,7 +183,9 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
if (_lastImage != null && File(_lastImage).existsSync()) {
File(_lastImage).delete();
}
_cameraController.dispose();
if(_cameraController != null) {
_cameraController.dispose();
}
super.dispose();
}

Expand All @@ -161,11 +196,10 @@ class CameraMlVisionState<T> extends State<CameraMlVision<T>> {
? Center(child: CircularProgressIndicator())
: widget.loadingBuilder(context);
}
if (_cameraMlVisionState == _CameraState.noCamera ||
_cameraMlVisionState == _CameraState.error) {
if (_cameraMlVisionState == _CameraState.error) {
return widget.errorBuilder == null
? Center(child: Text('$_cameraMlVisionState'))
: widget.errorBuilder(context);
? Center(child: Text('$_cameraMlVisionState $_cameraError'))
: widget.errorBuilder(context, _cameraError);
}
return FittedBox(
alignment: Alignment.center,
Expand Down
19 changes: 14 additions & 5 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ packages:
camera:
dependency: "direct main"
description:
name: camera
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.3+2"
path: "packages/camera"
ref: "feature/camera_api_16_installation"
resolved-ref: a90670a0b60229aa707333e97a352cf2cf5ab050
url: "https://github.com/jaumard/plugins"
source: git
version: "0.4.2"
charcode:
dependency: transitive
description:
Expand All @@ -36,6 +38,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.14.11"
device_info:
dependency: "direct main"
description:
name: device_info
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0+1"
firebase_ml_vision:
dependency: "direct main"
description:
Expand Down Expand Up @@ -158,4 +167,4 @@ packages:
version: "2.0.8"
sdks:
dart: ">=2.1.0 <3.0.0"
flutter: ">=1.2.0 <2.0.0"
flutter: ">=0.2.4 <2.0.0"
9 changes: 8 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,15 @@ dependencies:
sdk: flutter
firebase_ml_vision: ^0.7.0
path_provider: ^0.5.0+1
camera: ^0.4.3+2
#camera: ^0.4.3+2
camera: #^4.0.0+1
#path: '../plugins/packages/camera'
git:
url: https://github.com/jaumard/plugins
ref: feature/camera_api_16_installation
path: packages/camera
pedantic: ^1.4.0
device_info: ^0.4.0+1

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit e820b33

Please sign in to comment.