Flutter--使用相机

目前使用

camera: ^0.9.8+1

import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:photo_view/photo_view_gallery.dart';
import 'package:ui_base/button/custom_button.dart';
import 'package:ui_base/extension/ext.dart';
import 'package:ui_base/widget/base_state.dart';
import 'package:ui_base/widget/ui_text.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:photo_view/photo_view.dart';

late List<CameraDescription> _cameras;

List<XFile> _photos = [];

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  _cameras = await availableCameras();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {

  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: CameraApp(),
    );
  }
}

/// CameraApp is the Main Application.
class CameraApp extends StatefulWidget {
  /// Default Constructor
  const CameraApp({Key? key}) : super(key: key);

  @override
  State<CameraApp> createState() => _CameraAppState();
}

class _CameraAppState extends BaseState<CameraApp> with WidgetsBindingObserver {
  late CameraController controller;

  @override
  void initState() {
    super.initState();
    initCamera(0);
  }

  initCamera(int index, {double zoom = 1}) {
    controller = CameraController(_cameras[index], ResolutionPreset.max);
    controller.initialize().then((_) {
      if (!mounted) {
        return;
      }
      controller.setZoomLevel(zoom);
      refresh();
    }).catchError((Object e) {
      if (e is CameraException) {
        switch (e.code) {
          case 'CameraAccessDenied':
            print('User denied camera access.');
            break;
          default:
            print('Handle other errors.');
            break;
        }
      }
    });
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  XFile? _lastImageFile;

  @override
  Widget build(BuildContext context) {

    if (!controller.value.isInitialized) {
      return Container();
    }
    return Scaffold(
      body: SafeArea(child: Column(children: [
        CameraPreview(controller).expanded(),
        SizedBox(height: midPadding,),
        Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
          UIButton(
            width: 50,
            height: 50,
            child: _lastImageFile != null ? Image.file(File(_lastImageFile!.path), fit: BoxFit.fill,) : null,
            onTap: () {
              if (_lastImageFile == null) return;
              //navigatorPush(PhotoListView(_photos.reversed.toList()));
            },
          ),

          UIButton(
            width: 64,
            height: 64,
            allRadius: 32,
            backgroundColor: Colors.red,
            onTap: () async {
              try {

                XFile file =  await controller.takePicture();

                Uint8List bytes = await file.readAsBytes();

                final result = await ImageGallerySaver.saveImage(
                    bytes,
                    quality: 100,
                    name: "hello");
                _lastImageFile = file;
                _photos.add(file);
                refresh();
              } catch(e) {

              }
            },
          ),

          SizedBox(width: 50, height: 50,)

        ], ).size(height: 200).padding(padding: EdgeInsets.only(left: 50, right: 50)),

      ],)),
      backgroundColor: Colors.black,
    );

    void actionCard() {

    }
  }


  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    final CameraController cameraController = controller;

    // App state changed before we got the chance to initialize.
    if (!cameraController.value.isInitialized) {
      return;
    }

    if (state == AppLifecycleState.inactive) {
      cameraController.dispose();
    } else if (state == AppLifecycleState.resumed) {
      initCamera(0);
    }
  }

  Widget lensListView() {
    return ListView.separated(
      scrollDirection: Axis.horizontal,
      itemBuilder: (context, index) {
        CameraDescription? description = _cameras[index];
        return UIButton(
          onTap: () {
            initCamera(index);
          },
          padding: EdgeInsets.only(left: smallPadding, right: smallPadding),
          child: UIText(text: "镜头${index + 1}", color: Colors.white,),
        );
      },
      separatorBuilder: (context, index) {
        return SizedBox(width: smallPadding,);
      },
      itemCount: _cameras.length
    ).size(height: 30);
  }
  
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值