网易首页 > 网易号 > 正文 申请入驻

flutter系列之:在flutter中使用相机拍摄照片

0
分享至

简介

在app中使用相机肯定是再平常不过的一项事情了,相机肯定涉及到了底层原生代码的调用,那么在flutter中如何快速简单的使用上相机的功能呢?

一起来看看吧。

使用相机前的准备工作

flutter中为使用camera提供了一个叫做camera的插件,我们首先需要安装这个插件。

安装插件的步骤很简单,如下所示:

flutter pub add camera

该命令会在pubspec.xml中添加下面的内容:

dependencies:
flutter:
sdk: flutter

camera: ^0.10.0+1

除了camera之外,我们还需要对照相机拍摄的照片进行保存,这样我们还需要用到path_provider和path这两个plugin。

我们使用同样的方式对这两个插件进行安装。

安装好之后,我们就可以在flutter中的代码中愉快的使用camera了。

在使用camera之前,我们还需要获取相应的权限信息,比如在IOS中,我们需要在 ios/Runner/Info.plist中添加下面的权限信息:

NSCameraUsageDescription
flutter需要用到你的照相机

在andorid中需要配合minSdkVersion>=21来使用。

在flutter中使用camera

camera插件为我们提供了一系列的功能来方便camera的使用。

camera的使用需要遵循下面的步骤,因为现在的手机可能会有多个摄像头,所以我们需要通过api获取到可以使用的摄像头列表。

接下来我们使用选中的摄像头,进行一些控制操作,然后需要使用相应的camera视图来展示相应的照相机图像.

最后调用摄像头相关的拍摄功能进行拍摄。

听起来好像挺复杂的,事实上只要遵照上面的顺序,一切都是非常简单的。

首先我们需要获取可用的摄像头列表,这个步骤是通过调用camera包中的availableCameras方法来实现的:

Future> availableCameras() async {
return CameraPlatform.instance.availableCameras();

availableCameras是一个异步方法,返回的是一个Future对象,其中的值是CameraDescription列表。

CameraDescription是对camera的描述文件:

const CameraDescription({
required this.name,
required this.lensDirection,
required this.sensorOrientation,

name是摄像头的名称,lensDirection是摄像头面对的方向,sensorOrientation是传感器的方向,也就说你的手机是正常放置,还是选择90度放置。

因为availableCameras是一个异步方法,所以我们需要把它包裹在一个异步方法中进行调用:

Future main() async {
// 保证所有的插件都加载完毕
WidgetsFlutterBinding.ensureInitialized();

//获取摄像头列表
final cameras = await availableCameras();

//拿到第一个摄像头
final firstCamera = cameras.first;
....

这里我们拿到了第一个摄像头,注意,这里的firstCamera是一个CameraDescription对象。

因为模拟器上没有摄像头,如果你是在模拟器上运行上面的程序的话,将会抛出下面的异常:

[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: Bad state: No element
#0 List.first (dart:core-patch/growable_array.dart:343:5)

为了对这个camra进行控制, 我们需要创建一个CameraController对象:

class CameraAppState extends State {
late CameraController _controller;
late Future _initializeControllerFuture;

@override
void initState() {
super.initState();
_controller = CameraController(
widget.camera,
ResolutionPreset.medium,
);
_initializeControllerFuture = _controller.initialize();
}

CameraController的构造函数需要一个CameraDescription对象和分辨率等信息,并且还需要进行初始化,这里我们调用了它的initialize方法。

这里的initialize方法也是一个异步方法。

为了在CameraController初始化之后再对Camera进行使用,我们需要在返回的widget中使用FutureBuilder来构建:

body: FutureBuilder(
future: _initializeControllerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return CameraPreview(_controller);
} else {
return const Center(child: CircularProgressIndicator());
},

具体要展示什么内容呢?这里使用的是camera包中自带的CameraPreview组件。

CameraPreview需要传入一个CameraController对象,也就是之前我们创建的对象。

最后就是调用CameraController的方法进行拍照了。我们把拍照的逻辑放在floatingActionButton中,如下所示:

floatingActionButton: FloatingActionButton(
onPressed: () async {
try {
await _initializeControllerFuture;
final image = await _controller.takePicture();

if (!mounted) return;

await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DisplayPictureScreen(
imagePath: image.path,
),
),
);
} catch (e) {
print(e);
}
},
child: const Icon(Icons.camera_alt),
)

具体的逻辑就是调用controller.takePicture方法进行拍照。将拍好照的image放在一个新的widget中展示。

总结

摄像头是app中常用的功能,flutter中的camera插件为我们提供了摄像头的控制功能,非常简单。

本文的例子:https://github.com/ddean2009/learn-flutter.git

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
解放军中将在京突然去世,两女儿定居美国,亲弟弟关联25家公司

解放军中将在京突然去世,两女儿定居美国,亲弟弟关联25家公司

求实者
2024-06-12 14:30:22
48岁老头娶小10岁大学生,洞房花烛夜,刚爬上床却被女子踹下床

48岁老头娶小10岁大学生,洞房花烛夜,刚爬上床却被女子踹下床

华人星光
2024-06-15 16:14:48
女主播爆料行业内幕,大量女主播都有价格,周淑怡确实值百万

女主播爆料行业内幕,大量女主播都有价格,周淑怡确实值百万

新游戏大妹子
2024-06-14 11:43:32
随着许家印的没落,其女儿的生活也被曝光,奢侈程度令人咋舌

随着许家印的没落,其女儿的生活也被曝光,奢侈程度令人咋舌

天闻地知
2024-06-14 14:07:23
大陆何时会动手?美国官员表态,台湾名嘴:赖清德赌大陆不会攻台

大陆何时会动手?美国官员表态,台湾名嘴:赖清德赌大陆不会攻台

千里持剑
2024-06-15 13:25:04
2023年国家自然科学基金评审专家名单汇总

2023年国家自然科学基金评审专家名单汇总

高分子科学前沿
2024-06-16 07:53:29
中国女排3-2土耳其!赛后评分:张常宁满分+4将出彩,一将需提升

中国女排3-2土耳其!赛后评分:张常宁满分+4将出彩,一将需提升

理工男评篮球
2024-06-15 23:27:43
“坐滩”舰终迎大结局?封锁见效,菲驻军或撤离,中方:允许离开

“坐滩”舰终迎大结局?封锁见效,菲驻军或撤离,中方:允许离开

国学聚焦
2024-06-15 14:41:15
3-0!6000万水货,打脸曼联名宿:西班牙走不远?一眼被看穿?

3-0!6000万水货,打脸曼联名宿:西班牙走不远?一眼被看穿?

贝塔说体育
2024-06-16 05:48:29
开始了!俄罗斯军人亲属呼吁官员儿子顶替亲人

开始了!俄罗斯军人亲属呼吁官员儿子顶替亲人

亡海中的彼岸花
2024-06-15 08:56:51
邢天虎-陕西延长石油(集团)有限责任公司原副董事长

邢天虎-陕西延长石油(集团)有限责任公司原副董事长

开心体育站
2024-06-16 11:19:12
新闻背后:贵州卫健委美女厅官杨慧落马,人上人到鬼中鬼的人生路

新闻背后:贵州卫健委美女厅官杨慧落马,人上人到鬼中鬼的人生路

肖飞说
2024-06-16 01:24:07
22岁小伙雇45岁保姆后,整天不出门在家过二人世界

22岁小伙雇45岁保姆后,整天不出门在家过二人世界

牛城王小帅
2024-06-12 13:48:47
50年石油美元协议到期 沙特:不再续约

50年石油美元协议到期 沙特:不再续约

南方都市报
2024-06-16 07:03:39
广州城中村简直是炼狱

广州城中村简直是炼狱

悠闲葡萄
2024-06-16 14:12:31
某音网红“璇子baby”被认出疑是探花203期中女主?

某音网红“璇子baby”被认出疑是探花203期中女主?

挪威森林
2024-06-16 07:25:21
无人驾驶小车成道路杀手!在后沙峪的交通噩梦

无人驾驶小车成道路杀手!在后沙峪的交通噩梦

悠闲葡萄
2024-06-15 12:43:58
上海这夜,耍大牌周也和勒肉张碧晨,都败给了“全裹”出镜的高叶

上海这夜,耍大牌周也和勒肉张碧晨,都败给了“全裹”出镜的高叶

一娱三分地
2024-06-16 08:55:03
再见曼城!1.2亿标王挂牌出售!顶撞瓜帅,不道歉,或转投大巴黎

再见曼城!1.2亿标王挂牌出售!顶撞瓜帅,不道歉,或转投大巴黎

阿泰希特
2024-06-16 11:34:34
直击:白金汉宫礼台上威廉凯特恩爱对视,夏洛特站C位女王范十足

直击:白金汉宫礼台上威廉凯特恩爱对视,夏洛特站C位女王范十足

文雅笔墨
2024-06-16 01:01:18
2024-06-16 16:10:44
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

"地铁上被诬陷偷拍"男子将直播带货:需面对现实问题

头条要闻

"地铁上被诬陷偷拍"男子将直播带货:需面对现实问题

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

时尚
家居
手机
健康
公开课

40岁女人的“优雅范”穿搭,夏天学会这么搭,也能美得很轻松

家居要闻

空谷来音 朴素留白的侘寂之美

手机要闻

一次性购买四款荣耀折叠屏,谁这么豪横?

晚餐不吃or吃七分饱,哪种更减肥?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版