精华内容
参与话题
问答
  • Flutter中调用相机拍照、选择相册图片image_picker插件实现导入插件平台配置AndroidIOS使用 image_picker插件实现 导入插件 image_picker: ^0.6.7+12 # 最新版本请在pub.dev中查看 平台配置 Android Android SDK ...

    Flutter中调用相机拍照、选择相册图片

    image_picker插件实现

    导入插件

    image_picker: ^0.6.7+12		# 最新版本请在pub.dev中查看
    

    平台配置

    Android

    • Android SDK 29+
      不需要配置
    • Android SDK < 29
      修改AndroidManifest.xml文件
      <!-- 在application标签上添加 android:requestLegacyExternalStorage="true" -->
      <application android:requestLegacyExternalStorage="true"></application>
      
      <!-- 在application标签后添加权限设置 -->
      <uses-permission android:name="android.permission.CAMERA" />
      

    IOS

    在info.plist中添加配置
    NSPhotoLibraryUsageDescription
    NSCameraUsageDescription
    NSMicrophoneUsageDescription

    使用

    import 'dart:io';
    
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      File _image;
      final picker = ImagePicker();
    
      Future getImage() async {
        final pickedFile = await picker.getImage(source: ImageSource.camera);
    
        setState(() {
          if (pickedFile != null) {
            _image = File(pickedFile.path);
          } else {
            print('No image selected.');
          }
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Image Picker Example'),
          ),
          body: Center(
            child: _image == null
                ? Text('No image selected.')
                : Image.file(_image),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: getImage,
            tooltip: 'Pick Image',
            child: Icon(Icons.add_a_photo),
          ),
        );
      }
    }
    
    展开全文
  • Flutter:相机拍照/相册

    2019-12-05 11:12:38
    image_picker 使用第三方库 image_picker 添加依赖 image_picker: ^0.6.2+1 ...import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:imag...

    image_picker

    使用第三方库 image_picker

    添加依赖示例

    image_picker: ^0.6.2+1

    使用:

    先贴上完整代码

    import 'dart:io';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    import 'package:image_picker/image_picker.dart' as prefix0;
    
    class ImagePicker extends StatefulWidget {
      @override
      _ImagePickerState createState() => _ImagePickerState();
    }
    
    File image;
    
    class _ImagePickerState extends State<ImagePicker> {
      @override
      Widget build(BuildContext context) {
        return Material(
          child: Center(
            child:   GestureDetector(
              child: ClipOval(
                child: Container(
                  width: 70,
                  height: 70,
                  child: image != null ? Image.file(
                    image,
                    fit: BoxFit.cover,
                  ):Container()
                ),
              ),
              onTap: () {
                _showDialog(context);
              },
            ),
          ),
        );
      }
    
      _showDialog(BuildContext context) {
        ///这个是系统的组件,底部弹出框,类似ios的那种效果
        showCupertinoModalPopup(
            context: context,
            builder: (context) {
              var dialog = CupertinoActionSheet(
                title: Text('更改图像'),
                cancelButton: CupertinoActionSheetAction(
                    onPressed: () {
                      Navigator.pop(context, 0);
                    },
                    child: Text('取消')),
                actions: <Widget>[
                  CupertinoActionSheetAction(
                    onPressed: () {
                      _showImagePicker(ImageSource.camera);
                      Navigator.pop(context, 0);
                    },
                    child: Text('相机'),
                  ),
                  CupertinoActionSheetAction(
                    onPressed: () {
                      _showImagePicker(ImageSource.gallery);
                      Navigator.pop(context, 0);
                    },
                    child: Text('相册'),
                  ),
                ],
              );
              return dialog;
            });
      }
    
      ///ImageSource是Image_picker库里面的,不要自己去创建
      _showImagePicker(ImageSource type) async {
        File data = await prefix0.ImagePicker.pickImage(source: type);
        setState(() {
          image = data;
        });
      }
    
    }
    
    返回类型默认是File,使用非常简单,ios使用详情请移步到 https://pub.flutter-io.cn/packages/image_picker
    展开全文
  • 很多应用都需要使用到设备的相机模块拍摄图片和视频。因此,Flutter 提供了camera插件。camera插件提供了一系列可用的相机,并使用特定的相机展示相机预览...
        

    640?wx_fmt=jpeg

    很多应用都需要使用到设备的相机模块拍摄图片和视频。因此,Flutter 提供了 camera 插件。camera 插件提供了一系列可用的相机,并使用特定的相机展示相机预览、拍照、录视频。

    这个章节将会讲解如何使用 camera 插件去展示相机预览、拍照并显示。

    步骤

    1. 添加所需依赖
    2. 获取可用相机列表
    3. 创建并初始化 CameraController
    4. 使用 CameraPreview 展示相机的帧流
    5. 使用 CameraController 拍摄一张图片
    6. 使用 Image 组件展示图片

    1. 添加所需依赖

    为了完成这个章节,你需要向你的应用添加三个依赖:

    • camera - 提供使用设备相机模块的工具

    • path_provider - 寻找存储图片的正确路径

    • path - 创建适配任何平台的路径

    dependencies:
      flutter:
        sdk: flutter
      camera:
      path_provider:
      path:
    

    2. 获取可用相机列表

    接着,你可以使用 camera 插件获取可用相机列表。

    3. 创建并初始化 CameraController

    在选择了一个相机后,你需要创建并初始化 CameraController在这个过程中,与设备相机建立了连接并允许你控制相机并展示相机的预览帧流。
    实现这个过程,请依照以下步骤:

    (1)创建一个带有 State 类的 StatefulWidget 组件

    (2)添加一个变量到 State 类来存放 CameraController

    (3)添加另外一个变量到 State 类中来存放 CameraController.initialize() 返回的 Future

    (4)在 initState() 方法中创建并初始化控制器

    (5)在 dispose() 方法中销毁控制器


    请注意
    如果你没有初始化 CameraController,你就不能使用相机预览和拍照。

    4. 在 initState 方法中创建并初始化控制器

    接着,你能够使用 camera 中的 CameraPreview 组件来展示相机预览帧流。
    请记住在使用相机前,请确保控制器已经完成初始化。因此,你一定要等待前一个步骤创建 _initializeControllerFuture() 执行完毕才去展示 CameraPreview
    你可以使用 FutureBuilder 完成这个任务。
    // You must wait until the controller is initialized before displaying the
    // camera preview. Use a FutureBuilder to display a loading spinner until the
    // controller has finished initializing.
    FutureBuilder<void>(
      future: _initializeControllerFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          // If the Future is complete, display the preview.
          return CameraPreview(_controller);
        } else {
          // Otherwise, display a loading indicator.
          return Center(child: CircularProgressIndicator());
        }
      },
    )
    5. 使用 CameraController 拍照
    你可以使用 CameraController 的 takePicture 方法拍照。在这个示例中,创建了一个浮动按钮 FloatingActionButton,用户点击这个按钮,就能通过 CameraController 来拍摄图片。
    保存一张图片,需要经过一下三个步骤:

    (1)确保相机模块已经被初始化完成

    (2)创建图片需要被保存的路径

    (3)使用控制器拍摄一张图片并保存结果到上述路径

    最好把这些操作都放在 try / catch 方法块中来处理可能发生的异常。
    FloatingActionButton(
      child: Icon(Icons.camera_alt),
      // Provide an onPressed callback.
      onPressed: () async {
        // Take the Picture in a try / catch block. If anything goes wrong,
        // catch the error.
        try {
          // Ensure that the camera is initialized.
          await _initializeControllerFuture;
    
          // Construct the path where the image should be saved using the path
          // package.
          final path = join(
            // Store the picture in the temp directory.
            // Find the temp directory using the `path_provider` plugin.
            (await getTemporaryDirectory()).path,
            '${DateTime.now()}.png',
          );
    
          // Attempt to take a picture and log where it's been saved.
          await _controller.takePicture(path);
        } catch (e) {
          // If an error occurs, log the error to the console.
          print(e);
        }
      },
    ),
    )
    6. 在 dispose 方法中销毁控制器
    如果你能成功拍摄图片,你就可以使用 Image 组件展示被保存的图片。在这个示例中,这张图片是以文件的形式存储在设备中。
    因此,你需要提供一个 File 给 Image.file 构造函数。你能够通过传递你在上一步中创建的路径来创建一个 File 类的实例。
    Image.file(File('path/to/my/picture.png'))
    完整样例
    import 'dart:async';
    import 'dart:io';
    
    import 'package:camera/camera.dart';
    import 'package:flutter/material.dart';
    import 'package:path/path.dart' show join;
    import 'package:path_provider/path_provider.dart';
    
    Future<void> main() async {
      // Obtain a list of the available cameras on the device.
      final cameras = await availableCameras();
    
      // Get a specific camera from the list of available cameras.
      final firstCamera = cameras.first;
    
      runApp(
        MaterialApp(
          theme: ThemeData.dark(),
          home: TakePictureScreen(
            // Pass the appropriate camera to the TakePictureScreen widget.
            camera: firstCamera,
          ),
        ),
      );
    }
    
    // A screen that allows users to take a picture using a given camera.
    class TakePictureScreen extends StatefulWidget {
      final CameraDescription camera;
    
      const TakePictureScreen({
        Key key,
        @required this.camera,
      }) : super(key: key);
    
      @override
      TakePictureScreenState createState() => TakePictureScreenState();
    }
    
    class TakePictureScreenState extends State<TakePictureScreen> {
      CameraController _controller;
      Future<void> _initializeControllerFuture;
    
      @override
      void initState() {
        super.initState();
        // To display the current output from the Camera,
        // create a CameraController.
        _controller = CameraController(
          // Get a specific camera from the list of available cameras.
          widget.camera,
          // Define the resolution to use.
          ResolutionPreset.medium,
        );
    
        // Next, initialize the controller. This returns a Future.
        _initializeControllerFuture = _controller.initialize();
      }
    
      @override
      void dispose() {
        // Dispose of the controller when the widget is disposed.
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Take a picture')),
          // Wait until the controller is initialized before displaying the
          // camera preview. Use a FutureBuilder to display a loading spinner
          // until the controller has finished initializing.
          body: FutureBuilder<void>(
            future: _initializeControllerFuture,
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                // If the Future is complete, display the preview.
                return CameraPreview(_controller);
              } else {
                // Otherwise, display a loading indicator.
                return Center(child: CircularProgressIndicator());
              }
            },
          ),
          floatingActionButton: FloatingActionButton(
            child: Icon(Icons.camera_alt),
            // Provide an onPressed callback.
            onPressed: () async {
              // Take the Picture in a try / catch block. If anything goes wrong,
              // catch the error.
              try {
                // Ensure that the camera is initialized.
                await _initializeControllerFuture;
    
                // Construct the path where the image should be saved using the 
                // pattern package.
                final path = join(
                  // Store the picture in the temp directory.
                  // Find the temp directory using the `path_provider` plugin.
                  (await getTemporaryDirectory()).path,
                  '${DateTime.now()}.png',
                );
    
                // Attempt to take a picture and log where it's been saved.
                await _controller.takePicture(path);
    
                // If the picture was taken, display it on a new screen.
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => DisplayPictureScreen(imagePath: path),
                  ),
                );
              } catch (e) {
                // If an error occurs, log the error to the console.
                print(e);
              }
            },
          ),
        );
      }
    }
    
    // A widget that displays the picture taken by the user.
    class DisplayPictureScreen extends StatelessWidget {
      final String imagePath;
    
      const DisplayPictureScreen({Key key, this.imagePath}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Display the Picture')),
          // The image is stored as a file on the device. Use the `Image.file`
          // constructor with the given path to display the image.
          body: Image.file(File(imagePath)),
        );
      }
    }
    

    640?wx_fmt=png

    展开全文
  • Flutter选择图片和拍照示例,详情请看博客:https://yuzhiqiang.blog.csdn.net/article/details/88345232
  • Flutter从相册选择图片和相机拍照(image_picker)

    万次阅读 热门讨论 2019-03-08 13:03:59
    Flutter中从相册选择图片和拍照获取图片教程

    Flutter获取相册中的图片和用相机拍照

    在原生开发中,拍照及从图库选择图片是非常常见的需求,而且原生的图片选择第三方库也有很多并且很完善了。
    Flutter也给我们提供了好用的图片选择插件,ios和Android都能用的呦!
    image_picker

    先上图

    Flutter拍照:
    在这里插入图片描述

    Flutter选择图片
    在这里插入图片描述

    使用方法

    首先添加依赖

    在pubspec.yaml加入image_picker的依赖,版本号在github上找最新的即可。

    如下:
    在这里插入图片描述
    依赖添加完成点击右上角的 Packages get 出现finished及可。
    在这里插入图片描述

    使用
    依赖添加完成之后我们就可以正常使用了
    首先要导包:

    import 'package:image_picker/image_picker.dart';
    

    我们先来看看ImagePicker提供的方法,目前有两个,选图片和选视频。
    其中选择图片可以通过图库和相机的方式获得。

    在这里插入图片描述

    我们主要来看看图片

    拍照

     var image = await ImagePicker.pickImage(source: ImageSource.camera);
    

    相册

     var image = await ImagePicker.pickImage(source: ImageSource.gallery);
    

    是不是超级简单,在Android上权限申请都不需要管。

    下面是完整代码:

    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    class ImagePickerWidget extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _ImagePickerState();
      }
    }
    
    class _ImagePickerState extends State<ImagePickerWidget> {
      var _imgPath;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text("ImagePicker"),
            ),
            body: SingleChildScrollView(
              child: Column(
                children: <Widget>[
                  _ImageView(_imgPath),
                  RaisedButton(
                    onPressed: _takePhoto,
                    child: Text("拍照"),
                  ),
                  RaisedButton(
                    onPressed: _openGallery,
                    child: Text("选择照片"),
                  ),
                ],
              ),
            ));
      }
    
      /*图片控件*/
      Widget _ImageView(imgPath) {
        if (imgPath == null) {
          return Center(
            child: Text("请选择图片或拍照"),
          );
        } else {
          return Image.file(
            imgPath,
          );
        }
      }
    
      
      /*拍照*/
      _takePhoto() async {
        var image = await ImagePicker.pickImage(source: ImageSource.camera);
    
        setState(() {
          _imgPath = image;
        });
      }
    
      /*相册*/
      _openGallery() async {
        var image = await ImagePicker.pickImage(source: ImageSource.gallery);
        setState(() {
          _imgPath = image;
        });
      }
    }
    
    
    

    注意事项

    当图片过长超过显示宽高度的话,可能会报 The overflowing RenderFlex has an orientation of Axis.vertical. 这个错,且底部会有黄色的警告。
    具体报错信息大概如下:

    ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
    I/flutter (10595): The following message was thrown during layout:
    I/flutter (10595): A RenderFlex overflowed by 177 pixels on the bottom.
    I/flutter (10595):
    I/flutter (10595): The overflowing RenderFlex has an orientation of Axis.vertical.
    I/flutter (10595): The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and
    I/flutter (10595): black striped pattern. This is usually caused by the contents being too big for the RenderFlex.
    I/flutter (10595): Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the
    I/flutter (10595): RenderFlex to fit within the available space instead of being sized to their natural size.
    I/flutter (10595): This is considered an error condition because it indicates that there is content that cannot be
    I/flutter (10595): seen. If the content is legitimately bigger than the available space, consider clipping it with a
    I/flutter (10595): ClipRect widget before putting it in the flex, or using a scrollable container rather than a Flex,
    I/flutter (10595): like a ListView.

    这里我们直接使用 SingleChildScrollView(单个子控件的滚动布局控件) 即可。


    需要demo的可以下载: Flutter拍照和相册选择图片Demo


    如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可。也可以关注我的 Flutter 博客专栏,我会不定期的更新,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

    展开全文
  • Flutter开发篇--拍照或选择图片

    千次阅读 2019-06-19 15:07:45
    小萌是做iOS开发的,虽然是flutter开发,但是xcode还是需要配置的, 在这个info.plist中需要配置 <key>NSPhotoLibraryUsageDescription</key> <string>Example usage description</string...
  • flutter正式发布以来,官方库和三方库也是该有的功能都有了,可以说是选择颇多,但是还是建议按照官方的来,毕竟再怎么搞,自己也不能搬起石头砸自己的脚,按照正版的永远没错。      &...
  • flutter-照相机的使用

    千次阅读 2019-07-16 15:57:47
    本文介绍如何在flutter中使用照相机; 1 加入必要的plugin在.yaml文件中: camera: 2 在main函数中执行获取到可用的camera,并将camera数据传递到指定界面待使用; import 'package:camera/camera.dart'; List<...
  • Flutter: 使用相机拍照

    千次阅读 2019-06-16 09:20:00
    文档 camera import 'dart:io'; import 'package:camera/camera....import 'package:flutter/material.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; List<...
  • Flutter自定义相机、相册选择照片
  • 一丶 调用原生硬件Api实现照相机拍照和相册选择 导入第三方库:image_picker 拍照 _takePhoto() async { var image = await ImagePicker.pickImage(source: ImageSource.camera); setState(() { _imgPath = image; }...
  • 准备工作 (1)添加依赖 image_picker: ^0.6.4 image_cropper: ^1.2.1 Android 建议添加上这些权限在清单文件下: <uses-permission android:name="android.permission.INTERNET"/> <...
  • Flutter 获取相册中的图片和用相机拍照   在原生开发中,拍照及从图库选择图片是非常常见的需求,而且原生的图片选择第三方库也有很多并且很完善了。Flutter 也给我们提供了好用的图片选择插件,iOS 和 Android 都...
  • 一般的项目中,我们都会用到拍照或者使用照片,这里我们就介绍下flutter的插件。image_picker 在pubspec.yaml中添加依赖 dependencies: image_picker: ^0.6.2+3 You can install packages from the command line: ...
  • Flutter 拍照和File上传

    2019-12-26 09:46:09
    定义全局文件变量 List fileList = new List<...创建拍照按钮 @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('拍照上传'), actions: _ap...
  • flutter 调用摄像头Writing a camera application in Flutter is a pretty simple task, however when developing an app in Flutter, that is heavily focused on using the camera, I think I am obliged to ...
  • flutter拍照和选择图片

    2020-04-04 14:03:39
    flutter拍照和选择图片 一、导入 image_picker: ^0.6.1+4 qrscan: ^0.2.17 二、代码 import 'dart:io'; import 'package:image_picker/image_picker.dart'; import 'package:qrscan/qrscan.dart' as scanner; ...
  • 1.添加依赖:image_picker ...在配置文件pubspec.yaml添加如下配置: dependencies: flutter: ...2.开发拍照功能(完整例子) import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; import 'pa
  • flutter 调用摄像头和照片

    千次阅读 2019-10-05 20:28:36
    设置一个按钮调用 打开showCupertinoModalPopup FloatingActionButton(onPressed: (){ _showDialog(context); }, child: Text('aaaaaa'),), 打开底部弹出框 void _showDialog(...
  • 用到的组件 dio: ^3.0.2 image_picker: ^0.6.0+9 ...import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:dio/dio.dart'; class Image...
  • 想做个相机调用做个混编总结,然后回传照片给Flutterflutter没有UIImage对应的类型,就是说回调时直接回传UIImage时报错,说没有此类型,Flutter和NA互调信息都是走的字节流。然后把UIimage转成NSData类型回传,...
  • Flutter拍照和选择相册 一.在.yaml文件中导入image_picker插件,并pub get下载依赖 dependencies: flutter: sdk: flutter image_picker: ^0.6.2+1 二.平台兼容 针对ios平台,需要在Info.plist文件中定义相机、...
  • 拍照和获取本地图片: image_picker:版本: image_picker: ^0.5+3 import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; void main() { runApp(ImagePickerWidget()); } ...
  • 虽然现在Flutter关于裁剪图片的插件挺多,在经过一下午的踩坑后,发现了其中很多问题,在Pub上排名靠前的两个插件均有问题 image_crop问题是在于如果不嵌套在MaterilaApp当中,选择图片后,无法正常裁剪,而且会将...
  • 转自:... 需要先引入包image_picker dependencies: flutter: sdk: flutter english_words: ^3.1.5 # The following adds the Cupertino Icons fo...
  • Flutter 动态权限申请

    2020-08-25 14:55:29
    2. 参照 Flutter 的集成方法,集成permission_handler GitHub 3. 我这边集成的是 5.0的,跟网上的其他 3.X 的不一样 4. //请求权限 void requestPermission() async { await [Permission.camera, Permission....
  • 下面是Flutter拍照和图片选择的功能。 核心知识点: 1.使用了flutter中image_picker的三方来实现图片选择功能。 2.Wrap基础组件(实现自动换行) 3.Stack层叠布局控件和Positioned(固定叉号位置) 4....
  • Flutter 实现拍照上传功能 组件库:image_picker.dart,dio.dart 在学习过程中遇到这样一个问题,网上给出的很多案例中再给file赋值时使用的是 "UploadFileInfo"这个方法。如:"file": await UploadFileInfo....
  • Flutter实现拍照和相册选取图片功能

    千次阅读 2019-08-12 16:08:40
    1.添加依赖 在pubspec.yaml加入image_picker的依赖: image_picker: ^0.6.0+9 2.在main.dart导入需要使用的包 import 'package:image_picker/image_picker.dart'; 3.先实现一个FloatingActionButton ...
  • flutter正式发布以来,官方库和三方库也是该有的功能都有了,可以说是选择颇多,但是还是建议按照官方的来,毕竟再怎么搞,自己也不能搬起石头砸自己的脚,按照正版的永远没错。 这里我选择的是image_picker,photo...

空空如也

1 2 3 4 5 ... 20
收藏数 991
精华内容 396
关键字:

flutter拍照