Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Flutterでカメラで画像を撮って保存したい

まー、ありますわね。そーゆーのがね。

要件としては、写真撮ってメモを追加して何件かリストにしてPOSTだから、取った写真をリスト表示できることが必要。これが意外と難しくてワロタ。

最終的に、こういう風にするしかなさげ。

  • image_pickerプラグインで画像をカメラでとって、
  • path_providerにて、application内のディレクトリに保存してパスを持っておく
  • ギャラリーに移す場合は、gallary_saverでファイルをコピーする。
  • image_gallay_saverはバグがあって動かないようだ。

まとめ

ギャラリーに直接保存してしまうと、保存先のファイルパスが取れない。戻り値がboolになるのは、gallary_saverの仕様。

  Future<bool> takePhoto() async {
    final ImagePicker picker = ImagePicker();
    final PickedFile _image = await picker.getImage(source: ImageSource.camera);
    return GallerySaver.saveImage(_image.path)
  }

true/falseより、保存先のパスが一番欲しいよねw issueに上がってるけど、できないのかな。FlutterのMethodChannel#invokeMethod型のFuture返すから、頑張れば取れる可能性も微レ存。flutterの仕様的に。

github.com

あ、あとこのライブラリでやると、画像がギャラリーに保存できなかった。issueも上がってる。

pub.dev

こんだけのコードなんだけどね。多分MethodChannelの使い方が間違っているのだろう。

import 'dart:async';
import 'dart:typed_data';

import 'package:flutter/services.dart';

class ImageGallerySaver {
  static const MethodChannel _channel =
      const MethodChannel('image_gallery_saver');

  /// save image to Gallery
  /// imageBytes can't null
  static Future saveImage(Uint8List imageBytes, {int quality = 80, String name}) async {
    assert(imageBytes != null);
    final result =
    await _channel.invokeMethod('saveImageToGallery', <String, dynamic> {
      'imageBytes': imageBytes,
      'quality': quality,
      'name': name
    });
    return result;
  }

  /// Save the PNG,JPG,JPEG image or video located at [file] to the local device media gallery.
  static Future saveFile(String file) async {
    assert(file != null);
    final result =
    await _channel.invokeMethod('saveFileToGallery', file);
    return result;
  }

}

image_gallery_saver/image_gallery_saver.dart at master · hui-z/image_gallery_saver · GitHub

そんなかんじ。