为什么相机无法通过图像选择器工作?

时间:2019-12-06 19:40:09

标签: flutter flutter-dependencies imagepicker

这是代码,我用于image_picker来显示相机或画廊图像。在主要功能中另外使用.dart文件作为我在RunApp()下运行此代码。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
class Display_Image extends StatefulWidget {
  @override
  _Display_ImageState createState() => _Display_ImageState();
}

class _Display_ImageState extends State<Display_Image> {
  File _image;
  void ImageGrab(int i)
  async {
    setState(() {
      ShowSpinner=true;
    });
    try
    {
      if(i==1) {
        File gallerfile = await ImagePicker.pickImage(
            source: ImageSource.gallery);
        _image=gallerfile;
        setState(() {
          ShowSpinner=false;
        });
      }
      else {
        File gallerfile = await ImagePicker.pickImage(
            source: ImageSource.camera);
        _image=gallerfile;

      setState(() {
        ShowSpinner=false;
      });}
      //print('Selected image path: ${gallerfile.path}');

    }
    catch(e)
    {
      print(e);
    }

  }
  bool ShowSpinner=false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Test'),
      ),
      //backgroundColor: Colors.deepPurpleAccent,
      body: ModalProgressHUD(
        inAsyncCall: ShowSpinner,
        child: Column(
          children: <Widget>[
            //SizedBox(height: 10,),
            Container(
              color: Colors.deepPurpleAccent,
              height: 50,
              child: Row(
                children: <Widget>[
                  SizedBox(width: 20,),
                  FlatButton(
                    child: Icon(Icons.camera),
                    onPressed: (){
                      ImageGrab(0);
                    },
                  ),
                  SizedBox(width: 120,),
                  FlatButton(
                    child: Icon(Icons.image),
                    onPressed: (){
                      ImageGrab(1);
                    },
                  ),
                  SizedBox(width: 20,)
                ],
              ),
            ),
            //SizedBox(height: 10,),
            Expanded(
              child:Container(
                width: double.infinity,
                child: _image==null?Text('Image Appears here'):Image.file(_image),
                color: Colors.greenAccent,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

这是UI图片:

enter image description here

现在,我面临的两个问题是: 1.当我使用照相机按钮显示照相机图像时,照相机UI打开,捕获图像,按下复选按钮,UI继续加载,但不显示图像。 2.当我重新启动应用程序并重新运行它时,即使按了从头开始运行该应用程序时效果很好的画廊按钮,UI仍会继续加载,它会在控制台中显示一条消息,提示:

  

I / flutter(14072):PlatformException(已经激活,图像选择器为   已经激活,为空)

请注意,只有在遇到我提到的第二种情况时才会发生这种情况。 此外,我正在使用版本号 image_picker:^ 0.5.4 + 1 ,因为我正在使用firebase的mlkit库,如果我使用image_picker的新版本,则会引发大量消息,并产生大量错误。

请仔细研究一下,让我知道如何进一步进行下去。预先感谢。

1 个答案:

答案 0 :(得分:0)

所以这是我解决的问题。 确保的要点是:

  1. image_picker的版本必须是最新的更新版本。
  2. 执行相同操作时可能会出现Android-X兼容性错误。这些错误的出现如本GitHub link所述。

要解决问题2,您需要进行一些非常重要的更改,并且就我所知,您只能通过以下更改来做到这一点:

步骤1。转到android文件夹下的gradle.properties,并添加以下代码:

org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

第2步。现在转到android下的build.gradle,而不是app-> build.gradle下的。在查看文件时,请确保它以builscript开头(这样可以确保您使用的是正确的build.gradle文件。)

第3步。Ctrl+ A该文件中的所有内容,请注意ctrl + A您需要擦除所有内容并粘贴以下代码的所有内容:

buildscript {
    ext.kotlin_version = '1.3.0'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.2.0'
    }

    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.android.support'
                        && !details.requested.name.contains('multidex') ) {
                    details.useVersion "27.1.1"
                }

                if (details.requested.group == 'androidx.core'
                        && !details.requested.name.contains('androidx') ) {
                    details.useVersion "1.0.1"
                }
            }
        }
    }

}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

需要注意的非常重要的一点是,在编译过程中,您很可能会看到此警告消息为红色。请不要害怕它,让整个编译完成,然后再得出任何结论。尽管它显示为红色,但它不会停止编译,因为您将在底部看到一个旋转的圆圈,该圆圈将显示编译的进度。此后,它将消失,您将能够运行该应用程序。这是警告消息:

  

注意:   C:\ flutter.pub-cache \ hosted \ pub.dartlang.org \ cloud_firestore-0.12.11 \ android \ src \ main \ java \ io \ flutter \ plugins \ firebase \ cloudfirestore \ CloudFirestorePlugin.java   使用或覆盖已弃用的API。注意:重新编译   -Xlint:不建议使用。注意:C:\ flutter.pub-cache \ hosted \ pub.dartlang.org \ cloud_firestore-0.12.11 \ android \ src \ main \ java \ io \ flutter \ plugins \ firebase \ cloudfirestore \ CloudFirestorePlugin.java   使用未经检查或不安全的操作。注意:重新编译   -Xlint:未经检查以获取详细信息。错误:[TAG]无法解析变量'$ {animal.sniffer.version}'注意:   C:\ flutter.pub-cache \ hosted \ pub.dartlang.org \ mlkit-0.15.0 \ android \ src \ main \ java \ com \ azihsoyn \ flutter \ mlkit \ MlkitPlugin.java使用未经检查或不安全的操作。注意:重新编译   -Xlint:无需检查详细信息。

轰!而已。相信我,这一定会解决您的问题。

如果您仍然遇到任何此类问题,请尝试实施本link中提到的其他解决方案。