import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter_common/upload_image/ossUtil.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; // import 'package:images_picker/images_picker.dart'; // import 'package:images_picker/images_picker.dart'; import 'package:permission_handler/permission_handler.dart'; class UploadImagesTool { static uploadImagesTool({ String? oSSAccessKeyId, String? policy, String? callback, String? signature, String? ossDirectory, String? ossHost, required BuildContext context, Function? chooseImagesTap, int? max, bool? isVideo, Widget? isAddOtherWidget, }) async { await chooseCamera( context: context, max: max ?? 9, oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', isVideo: isVideo, isAddOtherWidget: isAddOtherWidget, chooseImages: (list) => chooseImagesTap?.call(list), ); } /// 动态申请权限,需要区分android和ios,很多时候它两配置权限时各自的名称不同 /// 此处以保存图片需要的配置为例 static Future requestPermission(context) async { late PermissionStatus status; // 1、读取系统权限的弹框 if (Platform.isIOS) { status = await Permission.photosAddOnly.request(); } else { status = await Permission.camera.request(); } // 2、假如你点not allow后,下次点击不会在出现系统权限的弹框(系统权限的弹框只会出现一次), // 这时候需要你自己写一个弹框,然后去打开app权限的页面 if (status != PermissionStatus.granted) { showCupertinoDialog( context: context, builder: (BuildContext ctx) { return CupertinoAlertDialog( title: const Text('您需要去打开权限'), content: const Text('请打开您的相机或者相册权限'), actions: [ CupertinoDialogAction( child: const Text('取消'), onPressed: () { Navigator.pop(ctx); }, ), CupertinoDialogAction( child: const Text('确定'), onPressed: () { openAppSettings(); Navigator.pop(ctx); // 打开手机上该app权限的页面 }, ), ], ); }); } else { return true; } return false; } /// static Future chooseCamera({ required BuildContext context, int? max, String? oSSAccessKeyId, String? policy, String? callback, String? signature, String? ossDirectory, String? ossHost, Function? chooseImages, bool? isVideo, Widget? isAddOtherWidget, }) async { // showCupertinoModalPopup( context: context, builder: (BuildContext ctx) { return isVideo == true ? CupertinoActionSheet( title: const Text('上传视频'), message: Text('请选择视频'), actions: [ CupertinoActionSheetAction( child: const Text('视频库'), onPressed: () { openGallery( max: max, isVideo: isVideo, oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', chooseImages: (list) => chooseImages?.call(list), ); Get.back(); }, ), ], cancelButton: CupertinoActionSheetAction( isDefaultAction: true, child: const Text('取消'), onPressed: () { Get.back(); }, ), ) : CupertinoActionSheet( title: const Text('上传图片'), message: Text('请选择上传方式\n相册最多${max ?? 9}张'), actions: isAddOtherWidget != null ? [ isAddOtherWidget, CupertinoActionSheetAction( child: const Text('拍照上传'), onPressed: () { openCamera( oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', chooseImages: (list) => chooseImages?.call(list), ); Get.back(); }, ), CupertinoActionSheetAction( child: const Text('相册'), onPressed: () { openGallery( max: max, oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', chooseImages: (list) => chooseImages?.call(list), ); Get.back(); }, ), ] : [ CupertinoActionSheetAction( child: const Text('拍照上传'), onPressed: () { openCamera( oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', chooseImages: (list) => chooseImages?.call(list), ); Get.back(); }, ), CupertinoActionSheetAction( child: const Text('相册'), onPressed: () { openGallery( max: max, oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', chooseImages: (list) => chooseImages?.call(list), ); Get.back(); }, ), ], cancelButton: CupertinoActionSheetAction( isDefaultAction: true, child: const Text('取消'), onPressed: () { Get.back(); }, ), ); }); } // static openCamera({ Function? chooseImages, String? oSSAccessKeyId, String? policy, String? callback, String? signature, String? ossDirectory, String? ossHost, }) async { XFile? file = await ImagePicker().pickImage( source: ImageSource.camera, ); if (file == null) { Get.back(); } else { String imgPath = await saveNetworkImg( file, oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', ); chooseImages?.call([imgPath]); } } static openGallery({ Function? chooseImages, String? oSSAccessKeyId, String? policy, String? callback, String? signature, String? ossDirectory, String? ossHost, int? max, bool? isVideo, }) async { if (isVideo == true) { XFile? video = await ImagePicker().pickVideo(source: ImageSource.gallery); String path = await saveNetworkImgGallery( video?.path ?? '', fileType: 'mp4', oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', ); chooseImages?.call([path]); print('video path ============ $path'); } else { List? images = await ImagePicker().pickMultiImage(); List list = []; for (var element in images) { String path = await saveNetworkImgGallery( element.path, oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', ); list.add(path); } chooseImages?.call(list); } } // 保存网络图片 static Future saveNetworkImg( XFile file, { String? oSSAccessKeyId, String? policy, String? callback, String? signature, String? ossDirectory, String? ossHost, }) async { // print("file.path ===== ${file.path}"); String string = await UploadOss.upload( file.path, fileType: "jpg", oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', ); // print("Gallery ===string== $string"); return string; } // 保存网络图片 static Future saveNetworkImgGallery( String path, { String? fileType, String? oSSAccessKeyId, String? policy, String? callback, String? signature, String? ossDirectory, String? ossHost, }) async { String string = await UploadOss.upload( path, fileType: fileType ?? "jpg", oSSAccessKeyId: oSSAccessKeyId ?? '', ossHost: ossHost ?? '', ossDirectory: ossDirectory ?? '', policy: policy ?? '', callback: callback ?? '', signature: signature ?? '', ); return string; } }