Flutter 与Flatter共享本地图像

Flutter 与Flatter共享本地图像,flutter,dart,share,Flutter,Dart,Share,我想分享一张从CameraController拍摄的图像 I文件的位置为example/data/user/0/com.user.test/cache/2019-09-10 16:32:52.281842.png 如何才能共享此本地映像 我添加了以下两行用于对本地存储进行读/写操作: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permissi

我想分享一张从CameraController拍摄的图像

I文件的位置为example/data/user/0/com.user.test/cache/2019-09-10 16:32:52.281842.png

如何才能共享此本地映像

我添加了以下两行用于对本地存储进行读/写操作:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
this.imagePath是文件的本地位置::/data/user/0/com.user.test/cache/2019-09-10 16:32:52.281842.png


你必须先保存图像吗?以及如何将其用于共享?如何才能共享此本地图像?

想法是共享Uint8List

本演示使用camera_camera软件包的示例
camera\u camera package是一款非常优秀的软件包,具有精心制作的功能,并在内部使用camera插件

代码片段
单击“拍照”后,系统返回一个文件(本例中为val),读取字节并传输到Uint8List

  print("path ${val}");
  List<int> bytes = await val.readAsBytes();
  Uint8List ubytes = Uint8List.fromList(bytes);
  await Share.file('ESYS AMLOG', 'amlog.jpg', ubytes, 'image/jpg');
打印(“路径${val}”);
List bytes=wait val.readAsBytes();
Uint8List ubytes=Uint8List.fromList(字节);
等待Share.file('ESYS AMLOG','AMLOG.jpg',ubytes',image/jpg');
完整代码

import 'dart:io';


import 'package:flutter/material.dart';
import 'package:camera_camera/camera_camera.dart';
import 'dart:typed_data';
import 'package:esys_flutter_share/esys_flutter_share.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  File val;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text("Rully")),
        floatingActionButton: FloatingActionButton(
            child: Icon(Icons.camera_alt),
            onPressed: () async {
              val = await showDialog(
                  context: context,
                  builder: (context) => Camera(
                        mode: CameraMode.fullscreen,
                        orientationEnablePhoto: CameraOrientation.landscape,
                        /*
                        imageMask: CameraFocus.square(
                          color: Colors.black.withOpacity(0.5),
                        ),
                        */
                      ));

              print("path ${val}");
              List<int> bytes = await val.readAsBytes();
              Uint8List ubytes = Uint8List.fromList(bytes);
              await Share.file('ESYS AMLOG', 'amlog.jpg', ubytes, 'image/jpg');

              setState(() {});
            }),
        body: Center(
            child: Container(
                height: MediaQuery.of(context).size.height * 0.7,
                width: MediaQuery.of(context).size.width * 0.8,
                child: val != null
                    ? Image.file(
                        val,
                        fit: BoxFit.contain,
                      )
                    : Text("Tire a foto"))));
  }
}
导入'dart:io';
进口“包装:颤振/材料.省道”;
导入“包装:camera_camera/camera_camera.dart”;
导入“dart:键入的_数据”;
导入“包:esys_flatter_share/esys_flatter_share.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:主屏幕(),
);
}
}
类主屏幕扩展StatefulWidget{
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
文件val;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“Rully”)),
浮动操作按钮:浮动操作按钮(
子:图标(Icons.camera\u alt),
onPressed:()异步{
val=等待显示对话框(
上下文:上下文,
生成器:(上下文)=>摄影机(
模式:CameraMode.fullscreen,
定向功能照片:CameraOrientation.scape,
/*
imageMask:CameraFocus.square(
颜色:颜色。黑色。不透明度(0.5),
),
*/
));
打印(“路径${val}”);
List bytes=wait val.readAsBytes();
Uint8List ubytes=Uint8List.fromList(字节);
等待Share.file('ESYS AMLOG','AMLOG.jpg',ubytes',image/jpg');
setState((){});
}),
正文:中(
子:容器(
高度:MediaQuery.of(上下文).size.height*0.7,
宽度:MediaQuery.of(context).size.width*0.8,
子:val!=null
?Image.file(
瓦尔,
适合:BoxFit.contain,
)
:文本(“轮胎a foto”);
}
}
演示屏幕
在照相机中\u照相机示例“拍照”按钮将显示在横向mdoe中
文件路径显示在底部

对于camera plugin官方示例,我仅更改以下内容
代码片段

void onTakePictureButtonPressed() {
    takePicture().then((String filePath) async{
      if (mounted) {
        setState(() {
          imagePath = filePath;
          videoController?.dispose();
          videoController = null;
        });
        if (filePath != null) {
          showInSnackBar('Picture saved to $filePath');
          File val = File(filePath);
          List<int> bytes = await val.readAsBytes();
          Uint8List ubytes = Uint8List.fromList(bytes);
          await Share.file('ESYS AMLOG', 'amlog.jpg', ubytes, 'image/jpg');
        }
      }
    });
  }
void onTakePictureButtonPressed(){
takePicture()。然后((字符串文件路径)异步{
如果(已安装){
设置状态(){
imagePath=filePath;
视频控制器?.dispose();
视频控制器=空;
});
if(filePath!=null){
showinsnakbar(“图片保存到$filePath”);
File val=文件(filePath);
List bytes=wait val.readAsBytes();
Uint8List ubytes=Uint8List.fromList(字节);
等待Share.file('ESYS AMLOG','AMLOG.jpg',ubytes',image/jpg');
}
}
});
}

void onTakePictureButtonPressed() {
    takePicture().then((String filePath) async{
      if (mounted) {
        setState(() {
          imagePath = filePath;
          videoController?.dispose();
          videoController = null;
        });
        if (filePath != null) {
          showInSnackBar('Picture saved to $filePath');
          File val = File(filePath);
          List<int> bytes = await val.readAsBytes();
          Uint8List ubytes = Uint8List.fromList(bytes);
          await Share.file('ESYS AMLOG', 'amlog.jpg', ubytes, 'image/jpg');
        }
      }
    });
  }