Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址:https://pub.dev/packages/image_picker

  1. 添加插件
    在这里插入图片描述
  2. 添加配置

android无需配置开箱即用,ios还需要配置info.plist

<key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> 
<key>NSCameraUsageDescription</key> <string>应用需要访问相机拍照</string> 
<key>NSMicrophoneUsageDescription</key> <string>应用需要访问麦克风录制视频</string>
  1. 核心代码
import 'package:image_picker/image_picker.dart';final ImagePicker picker = ImagePicker();
// 从相册选择相机
final XFile? image = await picker.pickImage(source: ImageSource.gallery);
// 拍照
final XFile? photo = await picker.pickImage(source: ImageSource.camera);
// 从相册选择视频
final XFile? galleryVideo =await picker.pickVideo(source: ImageSource.gallery);
// 录制视频
final XFile? cameraVideo = await picker.pickVideo(source: ImageSource.camera);
  1. 完整代码
import 'dart:io';import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
// 本地视频播放的逻辑
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';class ImagePickerDemo extends StatefulWidget {const ImagePickerDemo({super.key});State<ImagePickerDemo> createState() => _ImagePickerDemoState();
}class _ImagePickerDemoState extends State<ImagePickerDemo> {final ImagePicker _imagePicker  = ImagePicker();XFile? _pickerImage;XFile? _pickerVideo;// 配置加载本地视频late VideoPlayerController _videoPlayerController;late ChewieController _chewieController;// 拍照void _imagePickerCamera() async {final XFile? image = await _imagePicker.pickImage(source: ImageSource.camera,// 可以不设置,设置上可以避免数据太大maxHeight: 800,maxWidth: 800);if (image != null) {print(image.path);setState(() {_pickerVideo = null;_pickerImage = image;});}}// 相册选择图片void _imagePickerGallery() async {final XFile? image = await _imagePicker.pickImage(source: ImageSource.gallery,// 可以不设置,设置上可以避免数据太大maxHeight: 800,maxWidth: 800);if (image != null) {print(image.path);setState(() {_pickerVideo = null;_pickerImage = image;});} }// 视频-选择相机录制void _videoPickerCamera() async {final XFile? video = await _imagePicker.pickVideo(source: ImageSource.camera);if (video != null) {print(video.path);await _initVideo(File(video.path));setState(() {_pickerImage = null;_pickerVideo = video;});}}// 视频-选择相册void _videoPickerGallery() async {final XFile? video = await _imagePicker.pickVideo(source: ImageSource.gallery);if (video != null) {print(video.path);await _initVideo(File(video.path));setState(() {_pickerImage = null;_pickerVideo = video;});}}// 显示图片或者显示视频Widget _showImageOrVideoWidget() {if (_pickerImage != null) {return Image.file(File(_pickerImage!.path));} else if (_pickerVideo != null) {return AspectRatio(aspectRatio: _videoPlayerController.value.aspectRatio,child: Chewie(controller: _chewieController));} else {return Text("请选择图片或者视频");}}// 初始化播放器--用于播放本地视频Future _initVideo(File fileDir) async {_videoPlayerController = VideoPlayerController.file(fileDir);await _videoPlayerController.initialize();_chewieController = ChewieController(videoPlayerController: _videoPlayerController,aspectRatio: _videoPlayerController.value.aspectRatio,autoPlay: true,looping: false);}void dispose() {try {_videoPlayerController.dispose();_chewieController.dispose();} catch (e) {print(e);}super.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("图片选择器"),),body: ListView(padding: EdgeInsets.all(10),children: [Center(child: ElevatedButton(onPressed: _imagePickerGallery, child: Text("图片-选择相册"))),Center(child: ElevatedButton(onPressed: _imagePickerCamera, child: Text("图片-选择相机"))),Center(child: ElevatedButton(onPressed: _videoPickerGallery, child: Text("视频-选择相册"))),Center(child: ElevatedButton(onPressed: _videoPickerCamera, child: Text("视频-选择相机"))),SizedBox(height: 20),// 展示图片或者视频_showImageOrVideoWidget()],),);}
}
  1. 效果图
    在这里插入图片描述
  2. 上传文件(未测试,先记录)
  _uploadFile(String imagePath) async {var formData = FormData.fromMap({'name': 'wendux', 'age': 25, 'file': await MultipartFile.fromFile(imagePath, filename: 'aaa.png')}); var response = await Dio().post('https://xxx/imgupload', data: formData);print(response); }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35547.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 解题思路 19(Hot 100)

解题思路&#xff08;递归&#xff09;&#xff1a; 终止条件&#xff1a; 若节点为空&#xff0c;返回深度0。递归步骤&#xff1a; 分别计算左子树和右子树的最大深度&#xff0c;取较大者并加1&#xff08;当前节点&#xff09;。 Java代码&#xff1a; class Solution {…

如何启用 HTTPS 并配置免费的 SSL 证书

引言 HTTPS 已成为现代网站安全性的基础要求。通过 SSL/TLS 证书对数据进行加密&#xff0c;不仅可以保护用户隐私&#xff0c;还能提升搜索引擎排名并增强用户信任。本指南将详细介绍如何通过 Lets Encrypt&#xff08;免费、自动化的证书颁发机构&#xff09;为您的网站启用…

element-plus中Popconfirm气泡确认框组件的使用

1、基本使用 从element-plus官网复制代码&#xff1a; <template><el-popconfirm title"Are you sure to delete this?"><template #reference><el-button>Delete</el-button></template></el-popconfirm> </template…

软件需求分类、需求获取(高软46)

系列文章目录 软件需求分类&#xff0c;需求获取 文章目录 系列文章目录前言一、软件需求二、获取需求三、真题总结 前言 本节讲明软件需求分类、需求获取的相关知识。 一、软件需求 二、获取需求 三、真题 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

鸿蒙应用程序包HAP的开发与使用

1、HAP是什么&#xff1f; HAP&#xff08;Harmony Ability Package&#xff09;是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包&#xff0c;其主要分为两种类型&#xff1a;entry和feature。 entry&#xff1a;应用的主模块&#x…

【Mac】安装 Parallels Desktop、Windows、Rocky Linux

一、安装PD 理论上&#xff0c;PD只支持试用15天&#xff01;当然&#xff0c;你懂的。 第一步&#xff0c;在 Parallels Desktop for Mac 官网 下载 Install Parallels Desktop.dmg第二步&#xff0c;双击 Install Parallels Desktop.dmg 第三步&#xff0c;双击安装Paralle…

matlab 自适应模糊PID在反应釜温度控制中的应用

1、内容简介 matlab163-自适应模糊PID在反应釜温度控制中的应用 可以交流、咨询、答疑 2、内容说明 略摘要:针对工业过程控制具有时变、滞后、非线性等特点,在传统 PID 控制中融入模糊控制的功能,形成了新的参数自 适应模糊 PID 控制器,并把它应用在化工制药中常用的反应釜温度…

基于FPGA的3U机箱温度采集板PT100,应用于轨道交通/电力储能等

板卡简介&#xff1a; 本板为温度采集板&#xff08;PT100&#xff09;&#xff0c;对目标进行测温&#xff0c;然后将温度转换成处理器可识别的电流信号。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff0c;DC15V 4线制PT100&#xff1a;7路&#xff08;标称测温范围…

管家婆实用贴-如何设置打印机共享

很多商家在使用管家婆软件经营日常业务时会有多个操作员多台电脑需要打印&#xff0c;但是不想每台电脑配置一台打印机&#xff0c;一台电脑专门用来打印又浪费设备。遇到这种情况时可以将插线电脑上的打印机共享给其他的电脑一起使用&#xff0c;方便又高效。今天来和小编一起…

Qt QML实现视频帧提取

## 前言 视频帧率&#xff08;Frame Rate&#xff09;是指视频播放时每秒显示的画面帧数&#xff0c;通常用fps&#xff08;Frames Per Second&#xff09;来表示。视频是由一系列静止的图像帧组成的&#xff0c;而视频帧率则决定了这些图像帧在单位时间内播放的速度。较高的视…

LabVIEW压比调节器动态试验台

本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计&#xff0c;通过实用的LabVIEW图形化编程语言&#xff0c;优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性&#xff0c;以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…

3.17学习总结 java数组

地址值&#xff1a; D&#xff1a;表示当前数组内元素元素是double类型的 索引>下标&#xff0c;从0开始 最大索引&#xff1a;数组长度-1 把数据存储到数组中&#xff0c;一旦覆盖之后&#xff0c;原来的数据就不存在了 数组的遍历&#xff1a; 遍历&#xff1a;是取…

Linux-数据结构-线性表-单链表

一.链表的概念 【1】线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。 【2】特点&#xff1a; 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存…

Apifox Helper 自动生成API接口文档

在我们开发过程中我们在编写请求地址和编写请求参数的时候特别花费时间耗费了我们很多时间&#xff0c;作为一个程序员&#xff0c;更应该把精力时间集中在开发上&#xff0c; Apifox Helper 是 Apifox 团队针对 IntelliJ IDEA 环境所推出的插件&#xff0c;可以在 IDEA 环境中…

【软考-架构】13.1、软件架构概述-构件技术

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 ✨【重点】系统架构设计软件架构概述软件架构设计与生命周期构件&#x1f31f;软件架构风格数据流风格调用/返回风格独立构件风格虚拟机风格仓库风格闭环控制风格C2体系结…

C++特性——智能指针

为什么需要智能指针 对于定义的局部变量&#xff0c;当作用域结束之后&#xff0c;就会自动回收&#xff0c;这没有什么问题。 当时用new delete的时候&#xff0c;就是动态分配对象的时候&#xff0c;如果new了一个变量&#xff0c;但却没有delete&#xff0c;这会造成内存泄…

基于SpringBoot+Vue的幼儿园管理系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、教师、普通用户功能模块&#xff1a;用户管理、教师管理、班级管理、幼儿信息管理、会议记录管理、待办事项、职工考核、请假信息、缴费信息、体检管理、资源管理、原料管理、菜品信息管理等技术选型&#xff1a;SpringBoot&#xff0…

网络通信(传输层协议:TCP/IP ,UDP):

Socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。 网络协议&#xff1a;一台电脑的数据怎么传递给另一台电脑&#xff0c;是由网络协议来规定的 端口号&#…

Qt之自定义界面组件 一

通过qt中的painter绘图事件绘制一个电池电量图的变化。效果如下图 创建一个基于界面widget工程&#xff0c;在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码 文件目录结构 主要部分代码 //Tbattery.cpp #inc…