I'm using Google mlkit: ^0.9.0
for scanning bar-code in my Flutter project and when I run it this error occrues:
Note: C:\flutter\.pub-cache\hosted\pub.dartlang.org\mlkit-0.9.0\android\src\main\java\com\azihsoyn\flutter\mlkit\MlkitPlugin.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> More than one file was found with OS independent path 'META-INF/androidx.exifinterface_exifinterface.version'
I don't know what the reason.
This is my pubsec.yaml file:
name: flutter_test_barcode
description: A new Flutter application for test ocr
version: 1.0.0+1
environment:
sdk: ">=2.0.0-dev.68.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
path_provider: 0.4.1
mlkit: ^0.9.0
image_picker: 0.4.12+1
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
And this is my Main.dart file:
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mlkit/mlkit.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
File _file;
List<VisionText> _currentLabels = <VisionText>[];
FirebaseVisionTextDetector detector = FirebaseVisionTextDetector.instance;
@override
initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: new Text('Plugin example app'),
),
body: _buildBody(),
floatingActionButton: new FloatingActionButton(
onPressed: () async {
try {
//var file = await ImagePicker.pickImage(source: ImageSource.camera);
var file =
await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
_file = file;
});
try {
var currentLabels = await detector.detectFromPath(_file?.path);
setState(() {
_currentLabels = currentLabels;
});
} catch (e) {
print(e.toString());
}
} catch (e) {
print(e.toString());
}
},
child: new Icon(Icons.camera),
),
),
);
}
Widget _buildImage() {
return SizedBox(
height: 500.0,
child: new Center(
child: _file == null
? Text('No Image')
: new FutureBuilder<Size>(
future: _getImageSize(Image.file(_file, fit: BoxFit.fitWidth)),
builder: (BuildContext context, AsyncSnapshot<Size> snapshot) {
if (snapshot.hasData) {
return Container(
foregroundDecoration:
TextDetectDecoration(_currentLabels, snapshot.data),
child: Image.file(_file, fit: BoxFit.fitWidth));
} else {
return new Text('Detecting...');
}
},
),
),
);
}
Future<Size> _getImageSize(Image image) {
Completer<Size> completer = new Completer<Size>();
image.image.resolve(new ImageConfiguration()).addListener(
(ImageInfo info, bool _) => completer.complete(
Size(info.image.width.toDouble(), info.image.height.toDouble())));
return completer.future;
}
Widget _buildBody() {
return Container(
child: Column(
children: <Widget>[
_buildImage(),
_buildList(_currentLabels),
],
),
);
}
Widget _buildList(List<VisionText> texts) {
if (texts.length == 0) {
return Text('Empty');
}
return Expanded(
child: Container(
child: ListView.builder(
padding: const EdgeInsets.all(1.0),
itemCount: texts.length,
itemBuilder: (context, i) {
return _buildRow(texts[i].text);
}),
),
);
}
Widget _buildRow(String text) {
return ListTile(
title: Text(
"Text: ${text}",
),
dense: true,
);
}
}
class TextDetectDecoration extends Decoration {
final Size _originalImageSize;
final List<VisionText> _texts;
TextDetectDecoration(List<VisionText> texts, Size originalImageSize)
: _texts = texts,
_originalImageSize = originalImageSize;
@override
BoxPainter createBoxPainter([VoidCallback onChanged]) {
return new _TextDetectPainter(_texts, _originalImageSize);
}
}
class _TextDetectPainter extends BoxPainter {
final List<VisionText> _texts;
final Size _originalImageSize;
_TextDetectPainter(texts, originalImageSize)
: _texts = texts,
_originalImageSize = originalImageSize;
@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
final paint = new Paint()
..strokeWidth = 2.0
..color = Colors.red
..style = PaintingStyle.stroke;
print("original Image Size : ${_originalImageSize}");
final _heightRatio = _originalImageSize.height / configuration.size.height;
final _widthRatio = _originalImageSize.width / configuration.size.width;
for (var text in _texts) {
print("text : ${text.text}, rect : ${text.rect}");
final _rect = Rect.fromLTRB(
offset.dx + text.rect.left / _widthRatio,
offset.dy + text.rect.top / _heightRatio,
offset.dx + text.rect.right / _widthRatio,
offset.dy + text.rect.bottom / _heightRatio);
//final _rect = Rect.fromLTRB(24.0, 115.0, 75.0, 131.2);
print("_rect : ${_rect}");
canvas.drawRect(_rect, paint);
}
print("offset : ${offset}");
print("configuration : ${configuration}");
final rect = offset & configuration.size;
print("rect container : ${rect}");
//canvas.drawRect(rect, paint);
canvas.restore();
}
}
I changed libraries version according to Google Android X Compatibility documentation but the error still exists! Please help me
The problem was solved finally by changing version library of mlkit
and some other libraries in pubspec.yaml
file that I guessed they may have conflict with this. The key note is that '^' sign before version number
should be removed to make sure which version number
is exactly used, not the latest available version.