сохранить изображение в галерею после снятия с камеры

Я использую этот код, чтобы сделать снимок с помощью плагина image_picker:

var image = await ImagePicker.pickImage(source: ImageSource.camera);

Теперь я хочу сохранить изображение в каталоге галереи устройства.

Согласно принятому ответу на это сообщение Как сохранить файл изображения во Flutter? Файл выбран с помощью плагина Image_picker, это должно было быть сделано автоматически, но я не нахожу в галерее сделанный снимок.

Я уже добавил это разрешение в манифест:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

person Giacomo M    schedule 20.11.2019    source источник
comment
Если вы можете выбрать файл изображения с помощью средства выбора изображений, значит, файл изображения уже находится на вашем устройстве. Зачем вам делать копию?   -  person blackapps    schedule 20.11.2019
comment
I use this code to take a picture with the plugin image_picker: Сделать снимок? Или подобрать изображение? Довольно запутанно. Это открытие приложения камеры?   -  person blackapps    schedule 20.11.2019
comment
Это на Android Q?   -  person blackapps    schedule 20.11.2019
comment
Какое значение имеет image.path?   -  person blackapps    schedule 20.11.2019
comment
I would like to save the image in the gallery directory of the device Что вы считаете каталогом галереи устройства? Приложение Галерея показывает изображения со всего вашего устройства.   -  person blackapps    schedule 20.11.2019
comment
Если вы не видите новое изображение непосредственно в приложении Галерея, перезагрузите устройство.   -  person blackapps    schedule 20.11.2019
comment
@blackapps Я делаю снимок с камеры, но не могу сохранить его в галерее   -  person Giacomo M    schedule 21.11.2019
comment
Я до сих пор не понимаю, что вы имеете в виду, говоря о сохранении в галерее, но тогда вы не разместили никакого кода. И вы не отвечаете на мои вопросы.   -  person blackapps    schedule 21.11.2019
comment
@blackapps Я имею в виду галерею устройства, а не в папке приложения. За путь образа отвечу вам сегодня вечером.   -  person Giacomo M    schedule 21.11.2019
comment
Какая галерея у устройства? The Gallery app shows images from all over your device.   -  person blackapps    schedule 21.11.2019
comment
В устройствах Android у вас есть Галерея с изображениями, которые есть на устройстве.   -  person Giacomo M    schedule 21.11.2019
comment
Как я уже говорил вам дважды, есть только приложение Галерея, которое показывает изображения со всего устройства. Приложение "Галерея" теперь часто представляет собой приложение "Фото / Фото" от Google. Теперь вопрос в третий раз: где вы хотите сохранить это изображение?   -  person blackapps    schedule 21.11.2019
comment
@blackapps эти комментарии ни к чему не привели, можно закончить. Спасибо за вашу помощь   -  person Giacomo M    schedule 21.11.2019


Ответы (1)


Вы можете использовать пакет gallery_saver https://pub.dev/packages/gallery_saver
Получить изображение с ImagePicker и сохраните с помощью GallerySaver.saveImage

фрагмент кода

void _takePhoto() async {
    ImagePicker.pickImage(source: ImageSource.camera)
        .then((File recordedImage) {
      if (recordedImage != null && recordedImage.path != null) {
        setState(() {
          firstButtonText = 'saving in progress...';
        });
        GallerySaver.saveImage(recordedImage.path, albumName: albumName)
            .then((bool success) {
          setState(() {
            firstButtonText = 'image saved!';
          });
        });
      }
    });
  }

демонстрация

введите здесь описание изображения

полный код

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:image_picker/image_picker.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String firstButtonText = 'Take photo';
  String secondButtonText = 'Record video';
  double textSize = 20;
  String albumName ='Media';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      body: Container(
        color: Colors.white,
        child: Column(
          children: <Widget>[
            Flexible(
              flex: 1,
              child: Container(
                child: SizedBox.expand(
                  child: RaisedButton(
                    color: Colors.blue,
                    onPressed: _takePhoto,
                    child: Text(firstButtonText,
                        style:
                            TextStyle(fontSize: textSize, color: Colors.white)),
                  ),
                ),
              ),
            ),
            Flexible(
              child: Container(
                  child: SizedBox.expand(
                child: RaisedButton(
                  color: Colors.white,
                  onPressed: _recordVideo,
                  child: Text(secondButtonText,
                      style: TextStyle(
                          fontSize: textSize, color: Colors.blueGrey)),
                ),
              )),
              flex: 1,
            )
          ],
        ),
      ),
    ));
  }

  void _takePhoto() async {
    ImagePicker.pickImage(source: ImageSource.camera)
        .then((File recordedImage) {
      if (recordedImage != null && recordedImage.path != null) {
        setState(() {
          firstButtonText = 'saving in progress...';
        });
        GallerySaver.saveImage(recordedImage.path, albumName: albumName)
            .then((bool success) {
          setState(() {
            firstButtonText = 'image saved!';
          });
        });
      }
    });
  }

  void _recordVideo() async {
    ImagePicker.pickVideo(source: ImageSource.camera)
        .then((File recordedVideo) {
      if (recordedVideo != null && recordedVideo.path != null) {
        setState(() {
          secondButtonText = 'saving in progress...';
        });
        GallerySaver.saveVideo(recordedVideo.path, albumName: albumName)
            .then((bool success) {
          setState(() {
            secondButtonText = 'video saved!';
          });
        });
      }
    });
  }

  // ignore: unused_element
  void _saveNetworkVideo() async {
    String path =
        'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4';
    GallerySaver.saveVideo(path, albumName: albumName).then((bool success) {
      setState(() {
        print('Video is saved');
      });
    });
  }

  // ignore: unused_element
  void _saveNetworkImage() async {
    String path =
        'https://image.shutterstock.com/image-photo/montreal-canada-july-11-2019-600w-1450023539.jpg';
    GallerySaver.saveImage(path, albumName: albumName).then((bool success) {
      setState(() {
        print('Image is saved');
      });
    });
  }
}
person chunhunghan    schedule 21.11.2019
comment
Каким будет / значением recordedImage.path? - person blackapps; 21.11.2019
comment
recordImage.path - это средство выбора пути для временного сохранения этих файлов. - person chunhunghan; 21.11.2019
comment
да. Приведите, пожалуйста, пример значения такого пути. Где именно хранится? - person blackapps; 21.11.2019
comment
Вы можете распечатать путь. потому что в ios, android, эмуляторе все они разные, например / data / 0 / emulated / your_app / cache - person chunhunghan; 21.11.2019
comment
Спасибо. Я спросил, поскольку у меня нет Flutter, а @Giacomo M борется. Интересно, знает ли он, что файл уже существует. Он не указал значение для image.path. - person blackapps; 21.11.2019
comment
этот метод не работает на Android 11 - person ANDYNVT; 24.04.2021