代码之家  ›  专栏  ›  技术社区  ›  Mohsen Emami

发现多个文件具有独立于操作系统的路径“META-INF/androidx”。出口接口\出口接口。版本'

  •  0
  • Mohsen Emami  · 技术社区  · 7 年前

    我在用谷歌 mlkit: ^0.9.0 在我的颤振项目中扫描条形码时,当我运行它时,会出现以下错误:

    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'
    

    我不知道原因是什么。
    这是我的护照。yaml文件:

    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
    

    这是我的主要任务。dart文件:

    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();
      }
    }
    

    我根据谷歌Android X兼容性文档更改了库的版本,但错误仍然存在!请帮帮我

    0 回复  |  直到 7 年前
        1
  •  0
  •   Mohsen Emami    7 年前

    通过改变库的版本,最终解决了这个问题 mlkit 和其他一些图书馆 pubspec.yaml 我猜他们可能与此有冲突的文件。关键的一点是,“^”在前面签名 version number 应移除,以确保 版本号 已完全使用,而不是最新的可用版本。

    推荐文章