Flutter:拍照后图像未本地保存在设备上

问题描述 投票:0回答:0

我对 flutter 还很陌生,我正在尝试让应用程序使用相机包拍照,并将其保存到设备本地图库,但它没有用。一旦我拍完照片并尝试保存到图库,它确实弹出“成功下载”但我的图库中没有显示照片。

我确实看过其他类似的问题,比如

https://stackoverflow.com/questions/74743394/saving-list-of-objects-locally-on-device-with-shared-preferences-in-flutter
上的问题,并尝试解决它们,但对我没有用。知道有什么问题吗?

这是我在

pubspec.yaml

中尝试使用的所有依赖项
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  image_picker: ^0.8.6
  permission_handler: ^9.2.0
  camera: ^0.8.1+7
  dio: ^4.0.6
  gallery_saver: ^2.3.2
  path_provider: ^2.0.15
  path: ^1.8.2
  image_gallery_saver: ^1.7.1

从我的

main.dart
我有一个“拍照”按钮,它会带你到相机(
camera_page.dart

ElevatedButton(
     onPressed: () async {
       await availableCameras().then((value) => Navigator.push(
          context,
          MaterialPageRoute(
              builder: (_) => CameraPage(cameras: value))));
     },
     child: const Text("TAKE PICTURES"),
     style: ElevatedButton.styleFrom(fixedSize: const Size(350, 50)),
),

这是我

camera_page.dart
.

中的所有代码
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:pdf_combine_app/preview_page.dart';

class CameraPage extends StatefulWidget {
  const CameraPage({Key? key, required this.cameras}) : super(key: key);

  final List<CameraDescription>? cameras;

  @override
  State<CameraPage> createState() => _CameraPageState();
}

class _CameraPageState extends State<CameraPage> {
  late CameraController _cameraController;
  bool _isRearCameraSelected = true;

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

  @override
  void initState() {
    super.initState();
    initCamera(widget.cameras![0]);
  }

  Future takePicture() async {
    if (!_cameraController.value.isInitialized) {
      return null;
    }
    if (_cameraController.value.isTakingPicture) {
      return null;
    }
    try {
      await _cameraController.setFlashMode(FlashMode.off);
      XFile picture = await _cameraController.takePicture();
      Navigator.push(
          context,
          MaterialPageRoute(
              builder: (context) => PreviewPage(
                    picture: picture,
                  )));
    } on CameraException catch (e) {
      debugPrint('Error occured while taking picture: $e');
      return null;
    }
  }

  Future initCamera(CameraDescription cameraDescription) async {
    _cameraController =
        CameraController(cameraDescription, ResolutionPreset.high);
    try {
      await _cameraController.initialize().then((_) {
        if (!mounted) return;
        setState(() {});
      });
    } on CameraException catch (e) {
      debugPrint("camera error $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: SafeArea(
      child: Stack(children: [
        (_cameraController.value.isInitialized)
            ? CameraPreview(_cameraController)
            : Container(
                color: Colors.black,
                child: const Center(child: CircularProgressIndicator())),
        Align(
            alignment: Alignment.bottomCenter,
            child: Container(
              height: MediaQuery.of(context).size.height * 0.20,
              decoration: const BoxDecoration(
                  borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
                  color: Colors.black),
              child:
                  Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
                Expanded(
                    child: IconButton(
                  padding: EdgeInsets.zero,
                  iconSize: 30,
                  icon: Icon(
                      _isRearCameraSelected
                          ? CupertinoIcons.switch_camera
                          : CupertinoIcons.switch_camera_solid,
                      color: Colors.white),
                  onPressed: () {
                    setState(
                        () => _isRearCameraSelected = !_isRearCameraSelected);
                    initCamera(widget.cameras![_isRearCameraSelected ? 0 : 1]);
                  },
                )),
                Expanded(
                    child: IconButton(
                  onPressed: takePicture,
                  iconSize: 50,
                  padding: EdgeInsets.zero,
                  constraints: const BoxConstraints(),
                  icon: const Icon(Icons.circle, color: Colors.white),
                )),
                const Spacer(),
              ]),
            )),
      ]),
    ));
  }
}

如果你点击按钮拍照,它会带你到

preview_page.dart
,在那里它会显示拍摄的照片和一个下载它的按钮

这是

preview_page.dart

的完整代码
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';

class PreviewPage extends StatelessWidget {
  const PreviewPage({Key? key, required this.picture}) : super(key: key);

  final XFile picture;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Preview Page')),
      body: Center(
        child: Column(mainAxisSize: MainAxisSize.min, children: [
          Image.file(File(picture.path), fit: BoxFit.cover, width: 250),
          const SizedBox(height: 24),
          Text(picture.name),
          Center(
            child: ElevatedButton(
              child: const Text('Download'),
              onPressed: () async {
                await GallerySaver.saveImage(picture.path);

                ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(content: Text('Successfully Downloaded!!')));
              },
            ),
          )
        ]),
      ),
    );
  }
}

flutter dart camera gallery image-gallery
© www.soinside.com 2019 - 2024. All rights reserved.