【问题标题】:Why camera is not working from image picker?为什么相机不能从图像选择器工作?
【发布时间】:2020-03-31 19:31:28
【问题描述】:

这是代码,我使用 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,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

这是用户界面图像:

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

I/flutter (14072): PlatformException(already_active, Image picker is 已经激活,null)

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

请对此进行调查,并告诉我如何进一步处理此问题。提前致谢。

【问题讨论】:

  • 问题解决了吗?

标签: flutter flutter-dependencies imagepicker


【解决方案1】:

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

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

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

Step 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:deprecation 了解详情。注意: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 中提到的其他一些解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2023-04-06
    • 2023-03-09
    • 2016-08-21
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多