如何在抖动中打开相机闪光灯?

2024-03-12

我正在构建一个应用程序,用户可以将他们的视频上传到 firebase。我正在使用相机模块的相机包。我想在用户单击闪光灯图标时打开闪光灯或将其关闭。

我尝试找到一种通过相机包打开闪光灯的方法,但找不到任何打开闪光灯的方法。然后,我尝试使用灯泡包,但由于某种原因闪光灯无法打开。

import 'dart:io';

import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/foundation.dart';
import 'package:lamp/lamp.dart';

enum FlashState { Flash_OFF, Flash_On, Flash_Auto }

class CameraView extends StatefulWidget {
  final List<CameraDescription> cameras = [];
  CameraView() {
    availableCameras().then((cams) {
      cameras.addAll(cams);
      print(cameras.length);
      print(cams.toString());
    });
  }

  @override
  _CameraViewState createState() => _CameraViewState();
}

class _CameraViewState extends State<CameraView>
    with SingleTickerProviderStateMixin {
  CameraController _controller;
  int _selectedCameraIndex;
  bool _isRecording;

  FlashState currentFlashState = FlashState.Flash_OFF;
  String flashIcon = 'flash-off';

  AnimationController _animationController;
  Animation _colorTween;

  @override
  void initState() {
    _animationController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 300));
    _colorTween = ColorTween(begin: Colors.blueGrey, end: Colors.red)
        .animate(_animationController);
    // _controller = CameraController(widget.cameras[0], ResolutionPreset.high,
    //     enableAudio: true);
    // _isRecording = false;
    // _controller.initialize().then((_) {
    //   if (!mounted) {
    //     return;
    //   }
    //   setState(() {});
    // });
    if (widget.cameras.length > 0) {
      setState(() {
        _selectedCameraIndex = 0;
      });
      _switchCamera(widget.cameras[_selectedCameraIndex]);
    }
    super.initState();
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  Future<void> _startVideoRecording(BuildContext context) async {
    if (!_controller.value.isInitialized) {
      await showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: Text('Camera Not Responding.'),
              content: Center(
                child: Text('Something went wrong.Try Again Later.'),
              ),
              actions: <Widget>[
                FlatButton(
                  child: Text('Okay.'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                )
              ],
            );
          });
      return null;
    }
    if (_controller.value.isRecordingVideo) {
      return null;
    }
    setState(() {
      _isRecording = true;
    });
    final Directory appDirectory = await getApplicationDocumentsDirectory();
    final String videoDirectory = '${appDirectory.path}/Videos';
    await Directory(videoDirectory).create(recursive: true);
    final String currentTime = DateTime.now().millisecondsSinceEpoch.toString();
    final String filePath = '$videoDirectory/$currentTime.mp4';

    try {
      //Lamp.turnOn();
      await _controller.startVideoRecording(filePath);
      //Lamp.turnOff();
      StorageReference firebaseStorageReference =
          FirebaseStorage.instance.ref().child(basename(filePath));
      StorageUploadTask videoUploadTask = firebaseStorageReference.putFile(
        File(filePath),
        StorageMetadata(contentType: 'video/mp4'),
      );
      StorageTaskSnapshot uploadSnapshot = await videoUploadTask.onComplete;
    } catch (error) {
      print(error);
      return null;
    }
  }

  Future<void> _stopVideoRecording() async {
    if (!_controller.value.isRecordingVideo) {
      return null;
    }

    try {
      await _controller.stopVideoRecording();
      setState(() {
        _isRecording = false;
      });
    } catch (error) {
      print(error);
      return null;
    }
  }

  Future<void> _switchCamera(CameraDescription cameraDescription) async {
    if (_controller != null) {
      await _controller.dispose();
    }
    _controller = CameraController(cameraDescription, ResolutionPreset.high);

    _controller.addListener(() {
      if (mounted) {
        setState(() {});
      }
      if (_controller.value.hasError) {
        Fluttertoast.showToast(
            msg: 'An Error Occured',
            toastLength: Toast.LENGTH_SHORT,
            gravity: ToastGravity.BOTTOM,
            timeInSecForIos: 2,
            textColor: Colors.white,
            backgroundColor: Colors.black38);
      }
    });
    try {
      await _controller.initialize();
    } catch (error) {
      print(error);
    }

    if (mounted) {
      setState(() {});
    }
  }

  void _onSwitchCamera() {
    _selectedCameraIndex = _selectedCameraIndex < widget.cameras.length - 1
        ? _selectedCameraIndex + 1
        : 0;
    CameraDescription selectedCamera = widget.cameras[_selectedCameraIndex];
    _switchCamera(selectedCamera);
    setState(() {
      _selectedCameraIndex = _selectedCameraIndex;
    });
  }

  @override
  Widget build(BuildContext context) {
    return _controller.value.isInitialized
        ? Stack(
            fit: StackFit.expand,
            children: <Widget>[
              AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: CameraPreview(_controller),
              ),
              Positioned(
                left: MediaQuery.of(context).size.width * 0.40,
                bottom: MediaQuery.of(context).size.height * 0.04,
                child: AnimatedBuilder(
                  animation: _colorTween,
                  builder: (context, child) => IconButton(
                    icon: Icon(
                      MaterialCommunityIcons.getIconData('video'),
                    ),
                    color: _colorTween.value,
                    iconSize: 80.0,
                    onPressed: () {
                      if (!_isRecording) {
                        _animationController.forward();
                        _startVideoRecording(context);
                      } else if (_isRecording) {
                        _animationController.reverse();
                        _stopVideoRecording();
                      }
                    },
                  ),
                ),
              ),
              Positioned(
                right: 22.0,
                top: 22.0,
                child: IconButton(
                  icon: Icon(
                    MaterialCommunityIcons.getIconData('camera-switch'),
                  ),
                  onPressed: _onSwitchCamera,
                  iconSize: 28.0,
                ),
              ),
              Positioned(
                left: 22.0,
                top: 22.0,
                child: IconButton(
                  icon: Icon(
                    MaterialCommunityIcons.getIconData(flashIcon),
                  ),
                  onPressed: () {
                    currentFlashState =
                        currentFlashState.index < FlashState.values.length - 1
                            ? FlashState.values[currentFlashState.index + 1]
                            : FlashState.values[0];
                            if(currentFlashState == FlashState.Flash_On){
                              setState(() {
                                flashIcon = 'flash';
                              });
                              //Lamp.turnOn(); Turning on the flash through lamp package flutter but the flash not opening 
                            } else if(currentFlashState == FlashState.Flash_Auto){
                              setState(() {
                                flashIcon = 'flash-auto';
                              });
                            } else {
                              setState(() {
                                flashIcon = 'flash-off';
                              });
                              //Lamp.turnOff(); 
                            }
                  },
                ),
              )
            ],
          )
        : Container(
            child: Center(
              child: Text('Loading'),
            ),
          );
  }
}

根据相机最近的更新:^0.8.0。 您可以手动使用相机闪光灯:

步骤1: 首先按照整个相机说明进行操作:https://flutter.dev/docs/cookbook/plugins/picture-using-camera https://flutter.dev/docs/cookbook/plugins/picture-using-camera

第2步: 然后创建任何按钮,并在其 onPressed 函数上编写这一行。

//**For Flash OFF**:

 ElevatedButton(
            onPressed: () {
              _cameraController.setFlashMode(FlashMode.off);
            },
            style: ElevatedButton.styleFrom(primary: Colors.transparent),
            child: Text(
              "Flash Off",
              style: TextStyle(
                  color: Colors.white, backgroundColor: Colors.transparent),
            ),
          ),


 // **For Flash ON**
     ElevatedButton(
            onPressed: () {
              _cameraController.setFlashMode(FlashMode.always);
            },
            style: ElevatedButton.styleFrom(primary: Colors.transparent),
            child: Text(
              "Flash On",
              style: TextStyle(
                  color: Colors.white, backgroundColor: Colors.transparent),
            ),
          )
 //**For AUTO Flash:**
  ElevatedButton(
            onPressed: () {
              _cameraController.setFlashMode(FlashMode.auto);
            },
            style: ElevatedButton.styleFrom(primary: Colors.transparent),
            child: Text(
              "Auto Flash",
              style: TextStyle(
                  color: Colors.white, backgroundColor: Colors.transparent),
            ),
          )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在抖动中打开相机闪光灯? 的相关文章

随机推荐

  • 在 JavaScript 中将 Date() 舍入到最接近的 5 分钟

    Using a Date 例如 我如何将时间四舍五入到最接近的五分钟 例如 如果现在是下午 4 47它会将时间设置为下午 4 45 如果您已经有一个 那就非常简单了Date object var coeff 1000 60 5 var da
  • 使用 attr 设置与 CSP 一起使用的 css 变量内联

    我在想如何在不使用内联样式的情况下使用 css 变量 我想我可以用这个 data color color attr data color color green color var color blue div hello div 看来 a
  • Bootstrap datetimepicker 添加 1 天以记住

    我正在使用 bootstrap datetimepicker 如何在 datetimepicker bootstrap 中添加一天minDate 我想过滤minDate多1天 例如我的checkIndatetimepicker 是 02 1
  • git 将 master 合并到当前分支的快捷方式

    所以有时我在一个分支上工作 我想提取自分支创建以来在 origin master 上所做的更改 只是在做git merge master通常是不够的 因为本地主机可能没有远程主机的更改 所以我发现自己必须这样做 save any uncom
  • 为什么函数式编程好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为 Android 实现卫星菜单,XML 文件显示未找到资源

    首先 我尝试使用这个库 并且尝试编译一个基本测试程序 https github com siyamed android satellite menu https github com siyamed android satellite me
  • Xcode 场景 Dock 隐藏

    我的场景底座被隐藏了 我怎样才能使其可见 红色的不见了 您可以在左侧下方找到此按钮 只需单击它 you will get what you need Enjoy
  • R:将“vline”和“hline”语句组合在一起(ggplot2)

    我正在使用 R 编程语言 最近 我学习了如何使用 ggplot 库 绘制 水平线和垂直线 library ggplot2 Simple scatter plot sp lt ggplot data mtcars aes x wt y mpg
  • 跳过模型访问器

    我有一个名为 Run 的模型 其中包含此方法 public function getNameAttribute name if name Eendaags return this gt race edition gt race gt nam
  • 未创建骨干关系相关模型

    我正在尝试创建一个嵌套的关系骨干项目 但我真的很挣扎 我想要做的粗略想法如下所示 但在客户端上调用 fetch 时 我的印象是 将根据以 JSON 形式返回的预订自动创建许多预订 我的 JSON 格式可以在 MVC 轮廓下方看到 CLIEN
  • 链接到 Wagtail CMS 中的特定页面

    在 Wagtail CMS 中 我不知道如何构建指向特定页面的链接 我想要我的模板中有一个 固定的 未创作的 链接BlogIndexPage to my BlogIndexArchivePage反之亦然 在官方文档中pageurl http
  • 如何让 javascript 生成标题工具提示以显示 SVG

    我正在尝试获取 SVG 元素的工具提示 在 Firefox 16 0 2 下测试 我尝试了这个小例子 它工作正常
  • 如何解析布尔表达式并将其加载到类中?

    我有以下内容BoolExpr class class BoolExpr public enum BOP LEAF AND OR NOT inner state private BOP op private BoolExpr left pri
  • Eclipse 不突出显示匹配变量

    Eclipse 没有为我突出显示匹配的变量 我已经尝试通过更改 标记出现次数 Window gt Preferences gt Java gt Editor gt Mark Occurrences 但它不起作用 我不知道为什么这不起作用 而
  • Angular 2 应用程序基础 href 与 Cordova IOS

    我正在使用 Angular 2 和 cordova 开发一个应用程序 我使用 Angular cli 来构建应用程序 我现在在 IOS 应用程序启动时遇到了一些路由问题 基本href似乎设置错误 如果我使用以下命令设置基本 href 应用程
  • 读取大型 Excel 文件 .xlsx

    我正在使用图书馆 org apache poi XSSFWorkbook workbook new XSSFWorkbook fileInputStream 我想 org xml sax 库 但无法将其转换为工作簿 注意 最终结果我希望返回
  • 更新/删除不存在的行时出现 PL/SQL 异常

    我这些天正在学习 PL SQL 目前正在使用 oracle HR 模式处理过程和异常 这是我的简单过程 create or replace PROCEDURE DEL JOB p jobid jobs job id TYPE AS sqle
  • 相当于 CURRENTDIR="$PWD" 的批处理文件?

    我正在尝试翻译一个很简单 Unix shell 脚本转换为 批处理文件 除了那行 我已经把大部分都写下来了 CURRENTDIR PWD 我怎样才能将其翻译为 batchese Thanks 最简单的形式 SET CURRENTDIR cd
  • AJAX:提交表单而不刷新页面

    我有一个类似于以下的表格
  • 如何在抖动中打开相机闪光灯?

    我正在构建一个应用程序 用户可以将他们的视频上传到 firebase 我正在使用相机模块的相机包 我想在用户单击闪光灯图标时打开闪光灯或将其关闭 我尝试找到一种通过相机包打开闪光灯的方法 但找不到任何打开闪光灯的方法 然后 我尝试使用灯泡包