如何向Flutter相机添加闪光灯切换按钮(flutter_camera_ml_vision)

时间:2019-11-29 15:50:10

标签: android flutter dart firebase-mlkit

我正在开发一个内部带有条形码读取器的应用程序。我目前正在使用flutter_camera_ml_vision软件包。

我正在尝试添加一个闪光灯开/关浮动按钮,但是我不能在相机运行时激活闪光灯,只能在此之前。 错误:

I/System.out(19394): Torch Failed : CAMERA_IN_USE (4): setTorchMode:1732: Torch for camera "0" is not available due to an existing camera user

当照相机弹出时,闪光灯也会被禁用。

我该如何实现?我正在Android上进行测试。

当前代码:

import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_camera_ml_vision/flutter_camera_ml_vision.dart';
import 'package:camera/camera.dart';
import 'package:torch/torch.dart';

class ScanPage extends StatefulWidget {
  @override
  _ScanPageState createState() => _ScanPageState();
}

class _ScanPageState extends State<ScanPage> {
  bool resultSent = false;
  bool _hasFlash = true;
  bool _isOn = false;

  @override
  void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    initPlatformState();
  }

  @override
  dispose() {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
    super.dispose();
  }

  initPlatformState() async {
    bool hasFlash = await Torch.hasTorch;
    print("Device has flash ? $hasFlash");
    setState(() { _hasFlash = hasFlash; });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await _turnFlash();
        },
        child: Icon(_isOn ? Icons.flash_off : Icons.flash_on),
        backgroundColor: Colors.green,
      ),
      body: SafeArea(
        child: SizedBox(
          width: MediaQuery.of(context).size.width,
          height: MediaQuery.of(context).size.height,
          child: CameraMlVision<List<Barcode>>(
            resolution: ResolutionPreset.medium,
            detector: FirebaseVision.instance.barcodeDetector().detectInImage,
            onResult: (List<Barcode> barcodes) {
              if (!mounted || resultSent || barcodes.isEmpty) {
                return;
              }
              resultSent = true;
              Navigator.of(context).pop<Barcode>(barcodes.first);
            },
          ),
        ),
      ),
    );
  }

  Future _turnFlash() async {
    _isOn ? Torch.turnOff() : Torch.turnOn();
    var f = await Torch.hasTorch;
    setState((){
      _hasFlash = f;
      _isOn = !_isOn;
    });
  }
}

1 个答案:

答案 0 :(得分:0)

我确认@tottomotto在评论中说了什么。 camera插件中目前缺少该功能,torch给您带来错误的原因是,只能通过控制相机来控制闪光灯,而显然相机已经由插件打开了。

唯一的方法是实现所请求的功能,如the issue所说的:(

相关问题