FlutterCamera插件使⽤⼊门⽂章⽬录
0. 前⾔
开发时需要⽤到Camera 来进⾏视频图⽚截取, 因此来写⼀些这⽅⾯内容
1. 安装
在pubspec.yaml ⽂件中添加 camera 依赖, 这⾥推荐使⽤⼀个vscode 插件:
Pubspec Assist: 可以很⽅便的管理dart 的包依赖
dependencies:
flutter:
sdk: flutter
camera: ^0.5.7+4
1.1 iOS
到⽬录 ios/Runner/Info.plis, 添加flutter sdk
<key>NSCameraUsageDescription</key>
<string>Can I use the camera please?</string>
<key>NSMicrophoneUsageDescription</key>
<string>Can I use the mic please?</string>
1.2 Android
将Android sdk 的最低版本 调到21 (或更⾼)
进⼊android/adle ⽂件, 修改⽬标⾏为以下内容.
minSdkVersion 21
注意这⾥是android 的sdk最⼩版本, 与emulator最⼩版本不同, 所以确保⾃⼰的android emulator版本在27以上!
2. 测试项⽬
注意如果你使⽤官⽅的⽰例代码, 必须添加下⾯main()函数中的第⼀⾏,否则报错
2.1 ⽰例代码
下⾯是完整正确的⽰例代码
File: d:\study\Android\Flutter\cameraTest\cameratest\lib\main.dart
1:import'dart:async';
2:import'package:flutter/material.dart';
3:import'package:camera/camera.dart';
4:
5: List<CameraDescription> cameras;
6:
7: Future<void>main() async {
8: sureInitialized();
9: cameras = await availableCameras();
10:runApp(CameraApp());
11:}
12:
13:class CameraApp extends StatefulWidget {
14:@override
15: _CameraAppState createState()=>_CameraAppState();
16:}
17:
18:class _CameraAppState extends State<CameraApp>{
19: CameraController controller;
20:
21:@override
22:void initState(){
23:super.initState();
24: controller =CameraController(cameras[0], dium); 25: controller.initialize().then((_){
26:if(!mounted){
27:return;
28:}
29:setState((){});
30:});
31:}
32:
33:@override
34:void dispose(){
35: controller?.dispose();
36:super.dispose();
37:}
38:
39:@override
40: Widget build(BuildContext context){
41:if(!controller.value.isInitialized){
42:return Container();
43:}
44:return AspectRatio(
45: aspectRatio:
46: controller.value.aspectRatio,
47: child:CameraPreview(controller));
48:}
49:}
2.2 演⽰结果
依赖与代码都搞定之后就可以来打开测试了
按住alt+WASD 移动
3. 代码讲解
下⾯对上⾯⽰例的某些代码进⾏逐⾏的详细的讲解
3.1 cameras描述
下⾯这⾏代码表⽰了所有的camera , 为什么是个List呢?
想⼀想, 我们的⼿机有多少个camera?
前置的, 后置的, 等等, 我们⼀个⼿机可以有好多camera , 因此他是⼀个List
5: List<CameraDescription> cameras;
注意这个虽然是⽤来描述cameras 的, 但是并不是我们⼿机相机真正的实例化对象, 我们不能⽤它来操作相机
3.2 camera controller
controller是真正的相机实例化对象, 我们可以⽤它来进⾏录制, 拍照等等
下⾯的代码中, cameras[0]⼀般代表⼿机后置摄像头, ⽤来拍景⾊⽤, 你可以把他改成cameras[1]这样⼦就是前置的了(你可以⾃⼰修改代码尝试⼀下)
initState()中进⾏相机初始化
如果初始化失败了 就为未挂载状态(即 !mouted = true) ,那么就返回null值, 并且controller.value.isInitialized 变为false
如果初始化成功, 那么controller.value.isInitialized变为true, 并且渲染CameraApp Widget
21:@override
22:void initState(){
23:super.initState();
24: controller =CameraController(cameras[0], dium);
25: controller.initialize().then((_){
26:if(!mounted){
27:return;
28:}
29:setState((){});
30:});
31:}
3.3 dispose销毁对象
下⾯代码⽤来销毁controller
34:void dispose(){
35: controller?.dispose();
36:super.dispose();
37:}
为什么要进⾏销毁?
为了避免出现内存泄漏, controller是类内部的实例化对象, 所以显⽰的进⾏销毁, 避免出现内存泄漏
3.4 build ⽅法
39:@override
40: Widget build(BuildContext context){
41:if(!controller.value.isInitialized){
42:return Container();
43:}
44:return AspectRatio(
45: aspectRatio:
46: controller.value.aspectRatio,
47: child:CameraPreview(controller));
48:}
上⾯的代码中和上⾯所讲的相关
如果初始化失败了 controller.value.isInitialized 为false, 就返回⼀个空⽩的Container(), 在⽤户看来就是空⽩的什么也没有
如果初始化成功那么controller.value.isInitialized为true, 并且返回AspectRatio对象
3.3 CameraPreview 对象
虽然CameraPreview 对象 被⼀个AspectRadio对象包裹, 但是注意
AspectRatio 的英⽂意思是 宽⾼⽐ , 所以其实它是⼀个布局对象(与Camera 依赖包⽆关), 因此它会控制CemeraPreview对象的宽⾼⽐
CemeraPreview对象才是真正的摄像头界⾯对象, 需要⼀个摄像头实例化对象(这⾥是controller 作为参数) ,因此
CameraPreview(controller)建⽴⼀个摄像头界⾯显⽰在界⾯中
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论