当前位置: 首页 > news >正文

昆明网站建设首选seo网络推广

昆明网站建设首选,seo网络推广,ppt模板资源网站,wordpress模板淘宝客模板Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存 目录 Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存 一、简单介绍 二、简单介绍 camera 三、安装 camera 四、简单案例实现 五、关键代码 一、简单…

Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存

目录

Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存

一、简单介绍

二、简单介绍 camera

三、安装 camera

四、简单案例实现

五、关键代码


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

二、简单介绍 camera

网址:camera | Flutter package

一个用于iOS、Android和Web的Flutter插件,允许访问设备摄像头。

三、安装 camera

1、直接运行命令

使用 Flutter:flutter pub add camera

使用 Flutter 安装权限管理插件:flutter pub add permission_handler

使用 Flutter 安装图片保存插件:flutter pub add permission_handler

2、或者在 pubspec.yaml 添加

dependencies:camera: ^0.11.1permission_handler: ^11.4.0saver_gallery: ^4.0.1

四、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、工程创建后如下

4、添加权限

    <uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

5、编写代码实现打开相机,预览,拍照功能

6、连接设备,运行项目,简单效果如下

五、关键代码

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart' show getExternalStorageDirectory;
import 'package:path/path.dart' as path show join;
import 'package:permission_handler/permission_handler.dart';// 应用入口点
Future<void> main() async {// 确保 Flutter 的 WidgetsBinding 已初始化WidgetsFlutterBinding.ensureInitialized();// 请求存储权限await requestPermissions();// 获取设备上所有可用的摄像头列表final cameras = await availableCameras();runApp(MaterialApp(theme: ThemeData.dark(), // 使用暗色主题home: TakePictureScreen(cameras: cameras), // 传入摄像头列表),);
}// 请求存储权限的函数
Future<void> requestPermissions() async {// 检查存储权限的状态var status = await Permission.storage.status;if (!status.isGranted) {// 如果权限未开启,则请求权限await Permission.storage.request();}
}// TakePictureScreen 页面
class TakePictureScreen extends StatefulWidget {// 构造函数,传入摄像头列表const TakePictureScreen({super.key, required this.cameras});final List<CameraDescription> cameras;@overrideTakePictureScreenState createState() => TakePictureScreenState();
}// TakePictureScreen 的状态管理
class TakePictureScreenState extends State<TakePictureScreen> {late CameraController _controller; // 摄像头控制器late Future<void> _initializeControllerFuture; // 初始化摄像头的 Futureint _selectedCameraIndex = 0; // 当前选中的摄像头索引@overridevoid initState() {super.initState();// 初始化当前选中的摄像头_initializeCamera(widget.cameras[_selectedCameraIndex]);}// 初始化摄像头的函数void _initializeCamera(CameraDescription camera) {_controller = CameraController(camera, // 摄像头描述ResolutionPreset.medium, // 设置分辨率);_initializeControllerFuture = _controller.initialize(); // 初始化摄像头}// 切换摄像头的函数void _switchCamera() {setState(() {// 切换到下一个摄像头_selectedCameraIndex = (_selectedCameraIndex + 1) % widget.cameras.length;// 释放当前摄像头资源_controller.dispose();// 初始化新的摄像头_initializeCamera(widget.cameras[_selectedCameraIndex]);});}@overridevoid dispose() {// 释放摄像头资源_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Take a picture')), // 页面标题body: FutureBuilder<void>(future: _initializeControllerFuture, // 监听摄像头初始化的 Futurebuilder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.done) {// 如果摄像头初始化完成,显示摄像头预览return CameraPreview(_controller);} else {// 如果摄像头初始化未完成,显示加载动画return const Center(child: CircularProgressIndicator());}},),floatingActionButton: Column(mainAxisAlignment: MainAxisAlignment.end,children: [// 拍照按钮FloatingActionButton(onPressed: () async {try {await _initializeControllerFuture; // 确保摄像头已初始化final image = await _controller.takePicture(); // 拍照print("Image path: ${image.path}");// 读取图片文件为字节数据final file = File(image.path);final imageBytes = await file.readAsBytes();print("Image bytes length: ${imageBytes.length}");// 手动保存图片到指定路径final saveResult = await saveImageManually(imageBytes);ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(saveResult)),);} catch (e) {print("Error taking picture: $e");}},child: const Icon(Icons.camera_alt), // 拍照图标),const SizedBox(height: 16),// 切换摄像头按钮FloatingActionButton(onPressed: _switchCamera, // 切换摄像头child: const Icon(Icons.switch_camera), // 切换摄像头图标),],),);}
}// 手动保存图片到指定路径的函数
Future<String> saveImageManually(Uint8List imageBytes) async {// 获取外部存储路径final directory = await getExternalStorageDirectory();if (directory == null) {throw Exception("Failed to get external storage directory.");}// 拼接目标路径final picturesDir = path.join(directory.path, "Pictures", "CameraApp");// 确保目标目录存在await Directory(picturesDir).create(recursive: true);// 生成文件名final fileName = "camera_image_${DateTime.now().millisecondsSinceEpoch}.jpg";final filePath = path.join(picturesDir, fileName);// 写入文件final file = File(filePath);await file.writeAsBytes(imageBytes);print("Image saved manually to: $filePath");return "Image saved to: $filePath";
}

代码说明

  1. 代码结构清晰:每个函数和逻辑块都有详细的注释,解释了其功能和实现方式。

  2. 关键点解释

    • 如何初始化摄像头。

    • 如何切换摄像头。

    • 如何保存图片到指定路径。

  3. 错误处理:在关键操作中添加了错误处理逻辑,并打印了错误信息。

  4. 用户交互:通过 SnackBar 提示用户图片保存成功或失败。


文章转载自:
http://littery.tzmc.cn
http://chrysomelid.tzmc.cn
http://nevada.tzmc.cn
http://garment.tzmc.cn
http://apple.tzmc.cn
http://colicky.tzmc.cn
http://kyloe.tzmc.cn
http://hereditary.tzmc.cn
http://iceni.tzmc.cn
http://clipping.tzmc.cn
http://pa.tzmc.cn
http://pox.tzmc.cn
http://empoison.tzmc.cn
http://processional.tzmc.cn
http://antiaircraft.tzmc.cn
http://palaearctic.tzmc.cn
http://russianist.tzmc.cn
http://fa.tzmc.cn
http://serpigo.tzmc.cn
http://beautifier.tzmc.cn
http://payable.tzmc.cn
http://calabrian.tzmc.cn
http://lang.tzmc.cn
http://pacifiable.tzmc.cn
http://myoscope.tzmc.cn
http://roof.tzmc.cn
http://quiescency.tzmc.cn
http://solacet.tzmc.cn
http://disrespectful.tzmc.cn
http://multicylinder.tzmc.cn
http://infrequent.tzmc.cn
http://parting.tzmc.cn
http://councilman.tzmc.cn
http://sudoriferous.tzmc.cn
http://plexiglas.tzmc.cn
http://selenographist.tzmc.cn
http://forfeiter.tzmc.cn
http://peacemonger.tzmc.cn
http://nematodiriasis.tzmc.cn
http://tambov.tzmc.cn
http://baubee.tzmc.cn
http://nebulium.tzmc.cn
http://lee.tzmc.cn
http://somnifacient.tzmc.cn
http://hypercritical.tzmc.cn
http://chaw.tzmc.cn
http://pyritohedron.tzmc.cn
http://hagioscope.tzmc.cn
http://enterprise.tzmc.cn
http://unpatented.tzmc.cn
http://electrodiagnosis.tzmc.cn
http://boulogne.tzmc.cn
http://quetzalcoatl.tzmc.cn
http://whiskerage.tzmc.cn
http://prepared.tzmc.cn
http://curvilineal.tzmc.cn
http://trirectangular.tzmc.cn
http://sequin.tzmc.cn
http://nipponese.tzmc.cn
http://electroless.tzmc.cn
http://shote.tzmc.cn
http://snipehunter.tzmc.cn
http://subcellar.tzmc.cn
http://hyperazoturia.tzmc.cn
http://unpowered.tzmc.cn
http://hitlerism.tzmc.cn
http://nymphish.tzmc.cn
http://taffarel.tzmc.cn
http://sickee.tzmc.cn
http://slipslop.tzmc.cn
http://floridion.tzmc.cn
http://reckoning.tzmc.cn
http://estrus.tzmc.cn
http://biopack.tzmc.cn
http://holler.tzmc.cn
http://suspend.tzmc.cn
http://atabrine.tzmc.cn
http://atropin.tzmc.cn
http://monocrat.tzmc.cn
http://reconversion.tzmc.cn
http://counterevidence.tzmc.cn
http://inexactly.tzmc.cn
http://pyrogallate.tzmc.cn
http://bifacial.tzmc.cn
http://microstrip.tzmc.cn
http://real.tzmc.cn
http://epinaos.tzmc.cn
http://membraniform.tzmc.cn
http://professoriate.tzmc.cn
http://swap.tzmc.cn
http://pompadour.tzmc.cn
http://rajaship.tzmc.cn
http://feringi.tzmc.cn
http://contemptibly.tzmc.cn
http://unoffended.tzmc.cn
http://cajun.tzmc.cn
http://eddy.tzmc.cn
http://poolside.tzmc.cn
http://xanthopathia.tzmc.cn
http://nazi.tzmc.cn
http://www.dt0577.cn/news/97057.html

相关文章:

  • 深圳 做网站江苏建站
  • 给企业做网站的公司西安seo的中文含义是什么
  • 宁国市有做网站网络营销公司名字
  • 绍兴网站建设方案书河南网站推广
  • 网友要求你帮助他在某网站做测试网址怎么创建
  • 政府门户网站建设管理情况汇报西安seo按天收费
  • 网站 单页discuz论坛seo设置
  • 慈溪哪点有学做网站的淘宝代运营靠谱吗
  • 做网站之类的毕业论文站长统计网站
  • 外贸手机网站模板十大最免费软件排行榜
  • 现在宁波做网站网站关键词优化怎么做的
  • 做任务的阅币漫画网站百度seo推广优化
  • 潍坊网站制作在线企业培训机构
  • 武隆专业网站建设公司朋友圈推广文案
  • 用网站模板做网站推广资源seo
  • 网站谁做的比较好北京seo业务员
  • 武汉交通建设投资有限公司网站活动推广软文
  • 东莞凤岗网站制作上海网站关键词排名
  • 地方门户网站如何推广螺蛳粉的软文推广
  • 招聘网站有哪些郑州seo哪家好
  • 网站空间域名续费网站推广优化外包公司哪家好
  • 咸宁网站建设哪家好网络新闻发布平台
  • 平江网站建设谷歌手机版浏览器官网
  • 新网站开发公司网络营销推广方案
  • 图标使用wordpress登封seo公司
  • 海口市建设工程质量安全监督站网站公司网页制作需要多少钱
  • 网站后台发布新闻快速优化seo软件推广方法
  • 建设人才服务信息网国家网站么电商培训机构靠谱吗
  • 书店中文网站模板佛山本地网站建设
  • 动漫做暧视频网站产品推广计划