当前位置: 首页 > 知识库问答 >
问题:

在flutter中打开imagepicker包中的相机会使真实设备上的应用程序崩溃,但在模拟器(android)中运行良好

洪琦
2023-03-14

我正在使用flutter image_picker: ^0.6.0 17在应用程序中获取产品的图像,它在模拟器上绝对工作正常,但在真正的android设备上,当我单击“打开相机”按钮时,应用程序崩溃并重新启动。

我尝试将模拟器用作与我的设备相同的 API 级别,我正在 Redmi 6A Android奥利奥 8.1 上对其进行测试,没有发现问题颤振医生或颤振分析从 Gallary 中选择图像对两者都很好。

import 'dart:io';

import 'package:firstapp/models/product.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

class ImageInput extends StatefulWidget {
  final Function setImage;
  final Product product;

  ImageInput(this.setImage, this.product);

  @override
  State<StatefulWidget> createState() {
    return _ImageInputState();
  }
}

class _ImageInputState extends State<ImageInput> {
  File _imageFile;

  Future _getImage(BuildContext context, ImageSource source) async {
    print('getting image');
    File image = await ImagePicker.pickImage(source: source, maxWidth: 600);
    if(image == null){
      return null;
    }
    setState(() {
      print('file = image');
      _imageFile = image;
    });
    print('setting image');
    widget.setImage(image);
    Navigator.pop(context);
  }

  void _openImagePicker(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Container(
            padding: EdgeInsets.all(10),
            height: 150,
            child: Column(children: <Widget>[
              Text(
                'Pick an Image',
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
              SizedBox(
                height: 10,
              ),
              FlatButton(
                textColor: Theme.of(context).primaryColor,
                child: Text('Use Camera'),
                onPressed: () {
                  _getImage(context, ImageSource.camera);
                },
              ),
              FlatButton(
                textColor: Theme.of(context).primaryColor,
                child: Text('Use Gallery'),
                onPressed: () {
                  _getImage(context, ImageSource.gallery);
                },
              )
            ]),
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    final buttonColor = Theme.of(context).primaryColor;
    Widget previewImage = Text('Please select an image.');
    if (_imageFile != null) {
      previewImage = Image.file(
        _imageFile,
        height: 300.0,
        width: MediaQuery.of(context).size.width,
        fit: BoxFit.cover,
        alignment: Alignment.center,
      );
    } else if (widget.product != null) {
      previewImage = Image.network(
        widget.product.image,
        height: 300.0,
        width: MediaQuery.of(context).size.width,
        fit: BoxFit.cover,
        alignment: Alignment.center,
      );
    }

    return Column(
      children: <Widget>[
        OutlineButton(
          onPressed: () {
            _openImagePicker(context);
          },
          borderSide: BorderSide(color: buttonColor, width: 1),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Icon(
                Icons.camera_alt,
                color: buttonColor,
              ),
              SizedBox(
                width: 5.0,
              ),
              Text(
                'Add Image',
                style: TextStyle(color: buttonColor),
              )
            ],
          ),
        ),
        SizedBox(
          height: 10,
        ),
        previewImage,
      ],
    );
  }
}

这些是我按下“使用相机”然后应用程序重新启动后的调试日志

I/flutter (20143): getting image
D/Surface (20143): Surface::disconnect(this=0x9577d000,api=1)
D/GraphicBuffer(20143): unregister, handle(0xaa60e900) (w:720 h:1440 s:736 f:0x1 u:b00)
D/GraphicBuffer(20143): unregister, handle(0xaa610280) (w:720 h:1440 s:736 f:0x1 u:b00)
D/GraphicBuffer(20143): unregister, handle(0xaa610640) (w:720 h:1440 s:736 f:0x1 u:b00)
D/Surface (20143): Surface::disconnect(this=0x9577d000,api=-1)
D/Surface (20143): Surface::disconnect(this=0x9577c000,api=1)
D/GraphicBuffer(20143): unregister, handle(0x94f956c0) (w:720 h:1440 s:736 f:0x1 u:b00)
V/PhoneWindow(20143): DecorView setVisiblity: visibility = 4, Parent = ViewRoot{f21fea2 com.example.firstapp/com.example.firstapp.MainActivity,ident = 0}, this = DecorView@5af733[MainActivity]
Lost connection to device.
Exited (sigterm)

这是我正在使用的简单代码,只需用图像拾取器包中的< code>ImageSource.camera更改< code>source

Future _getImage(BuildContext context, ImageSource source) async {
    print('getting image');
    File image = await ImagePicker.pickImage(source: source, maxWidth: 600);
    if(image == null){
      return null;
    }
    setState(() {
      print('file = image');
      _imageFile = image;
    });
    print('setting image');
    widget.setImage(image);
    Navigator.pop(context);
  }

先谢谢了

共有2个答案

卫昊东
2023-03-14

在运行器Info.plist文件中,为我添加这些作品

<string>Need to upload image</string>
<key>NSCameraUsageDescription</key>
<string>Need to upload image</string>
<key>NSMicrophoneUsageDescription</key>
<string>Need to upload image</string>
徐卓
2023-03-14

更新,使用新版本的image_picker此问题已解决。

更多信息请参考https://pub.dev/packages/image_picker官方文件。

 类似资料:
  • 这里是我的主要活动 } 我感觉runOnUiThread方法有问题。感谢你的帮助.

  • 几周前我开始使用Android Studio。我在一个具有正常登录屏幕的应用程序上工作过,在模拟器上一切正常。但如果我尝试在我的三星Galaxy S7 Edge(Android 7.0)上运行该应用程序,该应用程序会立即崩溃。 我已经用API 23模拟了Nexus 5,当我用API 24模拟的Pixel尝试时,模拟器也会崩溃。所以我想问题取决于Android版本? Logcat(我把我正在使用的所

  • 我的Android Studio应用程序使用了OpenCV和NDK。apk太大了,所以我决定不支持x86设备(我只想支持armeabi-v7a和arm64-v8a),因此C++开发人员删除了对x86 ABI的支持,他不再可用。在我的应用程序分级中,我有: abiFilters'ARMEABI-V7A'、'ARM64-V8A' 然而,现在,该应用程序将在Google Pixel真实设备(或真实设备)

  • 我在Android中做了一个简单的计时器应用程序,就像只要过了10sec它就会给出一个消息“完成了!!!”。 在中(计划添加嘟嘟声),同时在另一个文本视图中显示。但我注意到我的应用程序在nexus模拟器上运行得很好,而在pixel模拟器上却崩溃了, 而且我的真手机(红米note 4)也一直崩溃, 这可能是什么原因? 我的代码: XML代码: Logcat错误消息: 图像

  • 它可以在仿真器和真实设备(android版本4)上工作,但不能在真实设备(android版本7.0)上工作 相关代码: logcat: 05-23 10:31:39.464 173 42-17342/laftel.net.laftel E/AndroidRuntime:致命异常:主进程:laftel.net.laftel,pid:17342 java.lang.nullPointerExcepti

  • 我正在尝试在Flutter中构建一个条形码扫描仪应用程序,为此,我正在使用这个插件,我将其添加到,修改了文件并添加了如下简单代码: 上述方法是在按下按钮时调用的。因此,应用程序加载并我单击按钮,整个模拟器崩溃,没有任何日志或错误消息。这是我在流程中记录的整个日志。最后,它说 这是默认相机应用程序的另一个日志。我似乎找不到发生这种情况的原因。我的模拟器设置都是默认的,我没有更改任何设置,除了后置摄像