From c6aa1132a6c7c806847e671968360cfc94785428 Mon Sep 17 00:00:00 2001 From: wy-m <2248243521@qq.com> Date: Fri, 28 Mar 2025 16:55:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AF=B9=E5=B7=B2=E6=9C=89=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E8=BF=9B=E8=A1=8C=E9=B8=BF=E8=92=99=E5=8C=96=E6=94=B9?= =?UTF-8?q?=E9=80=A0=EF=BC=8Cvideo=5Fcompress=E5=9C=A8=E9=B8=BF=E8=92=99?= =?UTF-8?q?=E4=B8=8A=E4=B8=8D=E8=83=BD=E8=BF=90=E8=A1=8C=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=9C=AA=E8=A7=A3=E5=86=B3=EF=BC=8Ccached=5Fnetwork=5Fimage?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=9B=A0=E4=B8=BA=E6=9C=89=E5=86=B2=E7=AA=81?= =?UTF-8?q?=EF=BC=8C=E6=9A=82=E6=97=B6=E6=B3=A8=E9=87=8A=E6=8E=89=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 126 +++++++++++++++++++++++++-------------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 19e808a..35fb0ba 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,63 +13,90 @@ dependencies: sdk: flutter im_flutter_sdk: 4.8.2 - # im_flutter_sdk: - # path: ../../../im_flutter_sdk/ - # im_flutter_sdk: - # git: - # url: https://www.github.com/easemob/im_flutter_sdk.git - # ref: dev_4.8.2 + + + - record: 5.1.2 +# record: 5.1.2 # oh无 换 flutter_sound + flutter_sound: + git: + url: "https://gitee.com/openharmony-sig/flutter_sound.git" + path: "flutter_sound" +# flutter_sound需要获取录音权限 + permission_handler: + git: + url: "https://gitee.com/openharmony-sig/flutter_permission_handler.git" + path: "permission_handler" shared_preferences: 2.2.3 chat_uikit_theme: 1.0.4 - path_provider: 2.1.4 +# path_provider: 2.1.4 暂时用不到 + +# file_picker: 8.0.5 #oh无 换 file_selector + file_selector: + git: + url: "https://gitee.com/openharmony-sig/flutter_packages.git" + path: "packages/file_selector/file_selector" + +# audioplayers: 6.0.0 + audioplayers: + git: + url: "https://gitee.com/openharmony-sig/flutter_audioplayers.git" + path: "packages/audioplayers" + +# image_picker: 1.1.2 + image_picker: + git: + url: "https://gitee.com/openharmony-sig/flutter_packages.git" + path: "packages/image_picker/image_picker" + +# video_thumbnail: 0.5.3 #oh无 换 video_compress + video_compress: + git: + url: "https://gitee.com/openharmony-sig/fluttertpc_video_compress.git" + ref: master +# export_video_frame: +# git: +# url: "https://gitee.com/openharmony-sig/fluttertpc_export_video_frame.git" +# ref: master + +# video_player: 2.8.1 + video_player: + git: + url: "https://gitee.com/openharmony-sig/flutter_packages.git" + path: "packages/video_player/video_player" - file_picker: 8.0.5 - - audioplayers: 6.0.0 + flutter_localization: 0.2.0 - image_picker: 1.1.2 + scroll_to_index: ^3.0.1 #oh无 - video_thumbnail: 0.5.3 +# cached_network_image: 3.3.0 +# cached_network_image: 3.1.0+1 #oh - video_player: 2.9.1 + chat_uikit_keyboard_panel: 0.1.1 - flutter_localization: 0.2.0 + html: ^0.15.4 #oh无 - scroll_to_index: ^3.0.1 +# 强制使用版本 +dependency_overrides: + shared_preferences: + git: + url: "https://gitee.com/openharmony-sig/flutter_packages.git" + path: "packages/shared_preferences/shared_preferences" - cached_network_image: 3.3.1 + flutter_localization: 0.1.14 - chat_uikit_keyboard_panel: 0.1.1 - # chat_uikit_keyboard_panel: - # path: ../chat_uikit_keyboard_panel - html: ^0.15.4 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - # This section identifies this Flutter project as a plugin project. - # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) - # which should be registered in the plugin registry. This is required for - # using method channels. - # The Android 'package' specifies package in which the registered class is. - # This is required for using method channels on Android. - # The 'ffiPlugin' specifies that native code should be built and bundled. - # This is required for using `dart:ffi`. - # All these are used by the tooling to maintain consistency when - # adding or updating assets for this project. + plugin: platforms: android: @@ -78,33 +105,6 @@ flutter: ios: pluginClass: EmChatUikitPlugin - # To add assets to your plugin package, add an assets section, like this: assets: - assets/images/ - - assets/images/emojis/ - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your plugin package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages + - assets/images/emojis/ \ No newline at end of file From 6a18afd96c949eedee6c3a46eb26ec5753a9d78f Mon Sep 17 00:00:00 2001 From: wy-m <2248243521@qq.com> Date: Fri, 28 Mar 2025 16:56:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E9=B8=BF=E8=92=99=E5=8C=96=E6=94=B9?= =?UTF-8?q?=E9=80=A0=EF=BC=8C=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0=EF=BC=8C?= =?UTF-8?q?=E5=BD=95=E9=9F=B3=E4=B8=8A=E4=BC=A0=EF=BC=8C=E6=8B=8D=E7=85=A7?= =?UTF-8?q?=EF=BC=8C=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=EF=BC=8C=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E8=A7=86=E9=A2=91=E5=92=8C=E5=BD=95=E9=9F=B3=E5=B7=B2?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E4=B8=8A=E4=BC=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sdk_service/wrappers/group_wrapper.dart | 2 +- lib/sdk_service/wrappers/room_wrapper.dart | 4 +- .../controllers/messages_view_controller.dart | 18 +- .../thread_messages_view_controller.dart | 18 +- lib/ui/views/messages_view.dart | 30 ++- lib/ui/views/thread_messages_view.dart | 43 +++- lib/ui/widgets/chat_uikit_avatar.dart | 7 +- .../chat_uikit_text_bubble_widget.dart | 59 +++--- lib/ui/widgets/record_bar/src/record_bar.dart | 195 +++++++++++------- lib/universal/inner_headers.dart | 7 +- 10 files changed, 243 insertions(+), 140 deletions(-) diff --git a/lib/sdk_service/wrappers/group_wrapper.dart b/lib/sdk_service/wrappers/group_wrapper.dart index 4fef67d..40d994d 100644 --- a/lib/sdk_service/wrappers/group_wrapper.dart +++ b/lib/sdk_service/wrappers/group_wrapper.dart @@ -15,7 +15,7 @@ mixin GroupWrapper on ChatUIKitServiceBase { onAllGroupMemberMuteStateChanged: onAllGroupMemberMuteStateChanged, onAllowListAddedFromGroup: onAllowListAddedFromGroup, onAllowListRemovedFromGroup: onAllowListRemovedFromGroup, - onAnnouncementChangedFromGroup: onAnnouncementChangedFromGroup, + // onAnnouncementChangedFromGroup: onAnnouncementChangedFromGroup, onAutoAcceptInvitationFromGroup: onAutoAcceptInvitationFromGroup, onInvitationAcceptedFromGroup: onInvitationAcceptedFromGroup, onInvitationDeclinedFromGroup: onInvitationDeclinedFromGroup, diff --git a/lib/sdk_service/wrappers/room_wrapper.dart b/lib/sdk_service/wrappers/room_wrapper.dart index ba2451c..e525200 100644 --- a/lib/sdk_service/wrappers/room_wrapper.dart +++ b/lib/sdk_service/wrappers/room_wrapper.dart @@ -15,11 +15,11 @@ mixin RoomWrapper on ChatUIKitServiceBase { onAllChatRoomMemberMuteStateChanged, onAllowListAddedFromChatRoom: onAllowListAddedFromChatRoom, onAllowListRemovedFromChatRoom: onAllowListRemovedFromChatRoom, - onAnnouncementChangedFromChatRoom: onAnnouncementChangedFromChatRoom, + // onAnnouncementChangedFromChatRoom: onAnnouncementChangedFromChatRoom, onChatRoomDestroyed: onChatRoomDestroyed, onMemberExitedFromChatRoom: onMemberExitedFromChatRoom, onMemberJoinedFromChatRoom: onMemberJoinedFromChatRoom, - onMuteListAddedFromChatRoom: onMuteListAddedFromChatRoom, + // onMuteListAddedFromChatRoom: onMuteListAddedFromChatRoom, onMuteListRemovedFromChatRoom: onMuteListRemovedFromChatRoom, onOwnerChangedFromChatRoom: onOwnerChangedFromChatRoom, onRemovedFromChatRoom: onRemovedFromChatRoom, diff --git a/lib/ui/controllers/messages_view_controller.dart b/lib/ui/controllers/messages_view_controller.dart index 023aaaa..ffb2083 100644 --- a/lib/ui/controllers/messages_view_controller.dart +++ b/lib/ui/controllers/messages_view_controller.dart @@ -626,18 +626,24 @@ class MessagesViewController extends ChangeNotifier if (path.isEmpty) { return; } - final imageData = await VideoThumbnail.thumbnailData( - video: path, - imageFormat: ImageFormat.JPEG, - maxWidth: 200, - quality: 80, + // 获取视频缩略图 + File? imageData = await VideoCompress.getFileThumbnail( + path, // 视频文件路径 + quality: 50, // 质量 (1-100) + position: -1 // 获取哪一帧 (-1 表示中间帧) ); + // final imageData = await VideoThumbnail.thumbnailData( + // video: path, + // imageFormat: ImageFormat.JPEG, + // maxWidth: 200, + // quality: 80, + // ); if (imageData != null) { final directory = await getApplicationCacheDirectory(); String thumbnailPath = '${directory.path}/thumbnail_${Random().nextInt(999999999)}.jpeg'; final file = File(thumbnailPath); - file.writeAsBytesSync(imageData); + file.writeAsBytesSync(imageData.readAsBytesSync()); final videoFile = File(path); diff --git a/lib/ui/controllers/thread_messages_view_controller.dart b/lib/ui/controllers/thread_messages_view_controller.dart index 7dd7ce4..208ae0c 100644 --- a/lib/ui/controllers/thread_messages_view_controller.dart +++ b/lib/ui/controllers/thread_messages_view_controller.dart @@ -301,18 +301,24 @@ class ThreadMessagesViewController if (path.isEmpty) { return; } - final imageData = await VideoThumbnail.thumbnailData( - video: path, - imageFormat: ImageFormat.JPEG, - maxWidth: 200, - quality: 80, + // 获取视频缩略图 + File? imageData = await VideoCompress.getFileThumbnail( + path, // 视频文件路径 + quality: 50, // 质量 (1-100) + position: -1 // 获取哪一帧 (-1 表示中间帧) ); + // final imageData = await VideoThumbnail.thumbnailData( + // video: path, + // imageFormat: ImageFormat.JPEG, + // maxWidth: 200, + // quality: 80, + // ); if (imageData != null) { final directory = await getApplicationCacheDirectory(); String thumbnailPath = '${directory.path}/thumbnail_${Random().nextInt(999999999)}.jpeg'; final file = File(thumbnailPath); - file.writeAsBytesSync(imageData); + file.writeAsBytesSync(imageData.readAsBytesSync()); final videoFile = File(path); diff --git a/lib/ui/views/messages_view.dart b/lib/ui/views/messages_view.dart index 3d10aaa..e9d3a9a 100644 --- a/lib/ui/views/messages_view.dart +++ b/lib/ui/views/messages_view.dart @@ -1576,17 +1576,25 @@ class _MessagesViewState extends State } Future selectFile() async { - FilePickerResult? result = await FilePicker.platform.pickFiles(); - if (result != null) { - PlatformFile file = result.files.single; - if (file.path?.isNotEmpty == true) { - controller.sendFileMessage( - file.path!, - name: file.name, - fileSize: file.size, - ); - return true; - } + final XFile? file = await openFile( + acceptedTypeGroups: [ + XTypeGroup( + label: '所有类型文件', + extensions: [], + mimeTypes: [], + ), + ], + ); + if (file != null) { + // 获取文件大小(字节) + final fileData = await file.readAsBytes(); + final sizeInBytes = fileData.lengthInBytes; + controller.sendFileMessage( + file.path, + name: file.name, + fileSize: sizeInBytes, + ); + return true; } return false; } diff --git a/lib/ui/views/thread_messages_view.dart b/lib/ui/views/thread_messages_view.dart index cf7ea6f..1f59585 100644 --- a/lib/ui/views/thread_messages_view.dart +++ b/lib/ui/views/thread_messages_view.dart @@ -992,19 +992,40 @@ class _ThreadMessagesViewState extends State } Future selectFile() async { - FilePickerResult? result = await FilePicker.platform.pickFiles(); - if (result != null) { - PlatformFile file = result.files.single; - if (file.path?.isNotEmpty == true) { - controller.sendFileMessage( - file.path!, - name: file.name, - fileSize: file.size, - ); - return true; - } + final XFile? file = await openFile( + acceptedTypeGroups: [ + XTypeGroup( + label: '所有类型文件', + extensions: [], + mimeTypes: [], + ), + ], + ); + if (file != null) { + // 获取文件大小(字节) + final fileData = await file.readAsBytes(); + final sizeInBytes = fileData.lengthInBytes; + controller.sendFileMessage( + file.path, + name: file.name, + fileSize: sizeInBytes, + ); + return true; } return false; + // FilePickerResult? result = await FilePicker.platform.pickFiles(); + // if (result != null) { + // PlatformFile file = result.files.single; + // if (file.path?.isNotEmpty == true) { + // controller.sendFileMessage( + // file.path!, + // name: file.name, + // fileSize: file.size, + // ); + // return true; + // } + // } + // return false; } void selectCard() async { diff --git a/lib/ui/widgets/chat_uikit_avatar.dart b/lib/ui/widgets/chat_uikit_avatar.dart index b64ba4c..d7b144e 100644 --- a/lib/ui/widgets/chat_uikit_avatar.dart +++ b/lib/ui/widgets/chat_uikit_avatar.dart @@ -1,4 +1,4 @@ -import 'package:cached_network_image/cached_network_image.dart'; +// import 'package:cached_network_image/cached_network_image.dart'; import '../../../chat_uikit.dart'; import '../../../universal/chat_uikit_log.dart'; @@ -92,7 +92,8 @@ class _ChatUIKitAvatarState extends State ), ), child: avatarUrl?.isNotEmpty == true - ? CachedNetworkImage( + ? Text('CachedNetworkImage无') + /*CachedNetworkImage( imageUrl: avatarUrl!, errorListener: (value) { chatPrint('avatarUrl: $avatarUrl, error: $value'); @@ -112,7 +113,7 @@ class _ChatUIKitAvatarState extends State width: widget.size, ); }, - ) + )*/ : ChatUIKitImageLoader.defaultAvatar( height: widget.size, width: widget.size, diff --git a/lib/ui/widgets/list_view_items/message_list_view_items/message_widget/chat_uikit_text_bubble_widget.dart b/lib/ui/widgets/list_view_items/message_list_view_items/message_widget/chat_uikit_text_bubble_widget.dart index 6e88090..0176ba7 100644 --- a/lib/ui/widgets/list_view_items/message_list_view_items/message_widget/chat_uikit_text_bubble_widget.dart +++ b/lib/ui/widgets/list_view_items/message_list_view_items/message_widget/chat_uikit_text_bubble_widget.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:cached_network_image/cached_network_image.dart'; +// import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import '../../../../../chat_uikit.dart'; @@ -108,34 +108,35 @@ class ChatUIKitTextBubbleWidget extends StatelessWidget { } return FittedBox( fit: BoxFit.none, - child: CachedNetworkImage( - height: 118, - width: constraints.maxWidth + 24, - imageUrl: imgUrl, - fit: BoxFit.cover, - placeholder: (context, url) { - return Container( - height: 118, - width: 300, - color: theme.color.isDark - ? theme.color.neutralColor3 - : theme.color.neutralColor95, - ); - }, - errorWidget: (context, url, error) { - debugPrint('urlPreview errorWidget: $url'); - return Container( - height: 118, - width: 300, - color: theme.color.isDark - ? theme.color.neutralColor3 - : theme.color.neutralColor95, - ); - }, - errorListener: (value) { - debugPrint('urlPreview errorListener: $value'); - }, - ), + child: Text('CachedNetworkImage无'), + // child: CachedNetworkImage( + // height: 118, + // width: constraints.maxWidth + 24, + // imageUrl: imgUrl, + // fit: BoxFit.cover, + // placeholder: (context, url) { + // return Container( + // height: 118, + // width: 300, + // color: theme.color.isDark + // ? theme.color.neutralColor3 + // : theme.color.neutralColor95, + // ); + // }, + // errorWidget: (context, url, error) { + // debugPrint('urlPreview errorWidget: $url'); + // return Container( + // height: 118, + // width: 300, + // color: theme.color.isDark + // ? theme.color.neutralColor3 + // : theme.color.neutralColor95, + // ); + // }, + // errorListener: (value) { + // debugPrint('urlPreview errorListener: $value'); + // }, + // ), ); }, ), diff --git a/lib/ui/widgets/record_bar/src/record_bar.dart b/lib/ui/widgets/record_bar/src/record_bar.dart index 0ad15b8..9156d9a 100644 --- a/lib/ui/widgets/record_bar/src/record_bar.dart +++ b/lib/ui/widgets/record_bar/src/record_bar.dart @@ -1,34 +1,39 @@ + import 'dart:async'; import 'dart:io'; import 'package:em_chat_uikit/chat_uikit.dart'; import 'package:em_chat_uikit/universal/inner_headers.dart'; +import 'package:flutter_sound/flutter_sound.dart'; +import 'package:flutter_sound/public/flutter_sound_recorder.dart'; import 'water_ripple.dart'; import 'package:flutter/material.dart'; -import 'package:record/record.dart'; - +import 'package:permission_handler/permission_handler.dart'; +// import 'package:record/record.dart'; class RecordBarController { - final RecordConfig recordConfig; - late final AudioRecorder record; + FlutterSoundRecorder recorderModule = FlutterSoundRecorder(); + // final RecordConfig recordConfig; + // late final AudioRecorder record; late final AudioPlayer player; String? currentPath; RecordBarState? _state; Directory? _directory; String? fileName; - RecordBarController({ - this.recordConfig = const RecordConfig( - encoder: AudioEncoder.aacLc, - bitRate: 128000, - sampleRate: 44100, - numChannels: 2, - ), - }) { + RecordBarController(/*{ + + // this.recordConfig = const RecordConfig( + // encoder: AudioEncoder.aacLc, + // bitRate: 128000, + // sampleRate: 44100, + // numChannels: 2, + // ), + }*/) { getTemporaryDirectory().then((value) => _directory = value); - record = AudioRecorder(); - record - .onAmplitudeChanged(const Duration(milliseconds: 100)) - .listen((event) { - onAmplitudeChanged?.call(event.current, event.max); - }); + // record = AudioRecorder(); + // record + // .onAmplitudeChanged(const Duration(milliseconds: 100)) + // .listen((event) { + // onAmplitudeChanged?.call(event.current, event.max); + // }); player = AudioPlayer(); } @@ -49,46 +54,94 @@ class RecordBarController { void dispose() { _state = null; player.release(); - record.dispose(); + // record.dispose(); + recorderModule.closeRecorder(); } + /// 初始化 + Future initRecorder() async { + await recorderModule.openRecorder(); + // 设置音频编解码器(可选) + await recorderModule.setSubscriptionDuration(Duration(milliseconds: 500)); + final status = await Permission.microphone.request(); + if (!status.isGranted) return null; + } + + /// 开始录音 Future startRecording() async { - if (await record.hasPermission()) { - if (await record.isRecording()) { + print('0000'); + if (await recorderModule.isRecording) { return; - } - try { - fileName = - "${DateTime.now().millisecondsSinceEpoch.toString()}.$extensionName"; - record.start(recordConfig, path: "${_directory!.path}/$fileName"); - _state?.switchRecordType(RecordBarRecordType.recording); - } catch (e) { - throw RecordError(recordFailed, 'Failed to start recording'); - } - } else { - throw RecordError(permissionDenied, 'Permission denied'); } - } + try { + print('1111'); + await initRecorder(); + print('2222'); + // fileName = "${DateTime.now().millisecondsSinceEpoch.toString()}.$extensionName"; + fileName = "${DateTime.now().millisecondsSinceEpoch.toString()}.m4a"; + print('3333'); + print('33334>${_directory!.path}/$fileName'); + print('3333'); + await recorderModule.startRecorder( + toFile: "${_directory!.path}/$fileName", // 录音文件路径 + codec: Codec.aacMP4, // 音频编码格式 + bitRate: 128000, + sampleRate: 44100, + numChannels: 2, + ); + print('4444'); + _state?.switchRecordType(RecordBarRecordType.recording); + } catch (e) { + print('5554$e'); + throw RecordError(recordFailed, 'Failed to start recording'); + } + // if (await record.hasPermission()) { + // if (await record.isRecording()) { + // return; + // } + // try { + // fileName = + // "${DateTime.now().millisecondsSinceEpoch.toString()}.$extensionName"; + // record.start(recordConfig, path: "${_directory!.path}/$fileName"); + // _state?.switchRecordType(RecordBarRecordType.recording); + // } catch (e) { + // throw RecordError(recordFailed, 'Failed to start recording'); + // } + // } else { + // throw RecordError(permissionDenied, 'Permission denied'); + // } + } + ///完成录音 Future finishRecording() async { - if (await record.isRecording()) { - String? path = await record.stop(); + String? path = await recorderModule.stopRecorder(); _state?.switchRecordType(RecordBarRecordType.recorded); currentPath = path; return path; - } + // if (await record.isRecording()) { + // String? path = await record.stop(); + // _state?.switchRecordType(RecordBarRecordType.recorded); + // currentPath = path; + // return path; + // } _state?.switchRecordType(RecordBarRecordType.idle); return null; } + ///停止录音 Future stopRecording() async { - if (await record.isRecording()) { - String? path = await record.stop(); - if (path != null) { - File file = File(path); - file.delete(); - } + String? path = await recorderModule.stopRecorder(); + if (path != null) { + File file = File(path); + file.delete(); } + // if (await record.isRecording()) { + // String? path = await record.stop(); + // if (path != null) { + // File file = File(path); + // file.delete(); + // } + // } _state?.switchRecordType(RecordBarRecordType.idle); } @@ -105,17 +158,19 @@ class RecordBarController { await player.stop(); _state?.switchRecordType(RecordBarRecordType.recorded); } - + /// 发送 Future send() async { String? path; - if (await record.isRecording()) { - path = await record.stop(); - _state?.switchRecordType(RecordBarRecordType.idle); - } else { - path = currentPath; - currentPath = null; + path = await recorderModule.stopRecorder(); _state?.switchRecordType(RecordBarRecordType.idle); - } + // if (await record.isRecording()) { + // path = await record.stop(); + // _state?.switchRecordType(RecordBarRecordType.idle); + // } else { + // path = currentPath; + // currentPath = null; + // _state?.switchRecordType(RecordBarRecordType.idle); + // } return RecordResultData(path: path, fileName: fileName); } @@ -124,25 +179,27 @@ class RecordBarController { } String get extensionName { - switch (recordConfig.encoder) { - case AudioEncoder.aacLc: - case AudioEncoder.aacEld: - case AudioEncoder.aacHe: - return 'm4a'; - case AudioEncoder.amrNb: - case AudioEncoder.amrWb: - return '3gp'; - case AudioEncoder.opus: - return 'opus'; - case AudioEncoder.flac: - return 'flac'; - case AudioEncoder.wav: - return 'wav'; - case AudioEncoder.pcm16bits: - return 'pcm'; - default: - return ''; - } + return 'm4a'; + // return 'adts'; + // switch (recordConfig.encoder) { + // case AudioEncoder.aacLc: + // case AudioEncoder.aacEld: + // case AudioEncoder.aacHe: + // return 'm4a'; + // case AudioEncoder.amrNb: + // case AudioEncoder.amrWb: + // return '3gp'; + // case AudioEncoder.opus: + // return 'opus'; + // case AudioEncoder.flac: + // return 'flac'; + // case AudioEncoder.wav: + // return 'wav'; + // case AudioEncoder.pcm16bits: + // return 'pcm'; + // default: + // return ''; + // } } } diff --git a/lib/universal/inner_headers.dart b/lib/universal/inner_headers.dart index 40ebc7b..02fa62e 100644 --- a/lib/universal/inner_headers.dart +++ b/lib/universal/inner_headers.dart @@ -1,10 +1,13 @@ export 'package:audioplayers/audioplayers.dart'; -export 'package:file_picker/file_picker.dart'; +// export 'package:file_picker/file_picker.dart'; +export 'package:file_selector/file_selector.dart'; export 'package:image_picker/image_picker.dart'; export 'package:path_provider/path_provider.dart'; export 'package:scroll_to_index/scroll_to_index.dart'; export 'package:shared_preferences/shared_preferences.dart'; export 'package:video_player/video_player.dart'; -export 'package:video_thumbnail/video_thumbnail.dart'; +// export 'package:video_thumbnail/video_thumbnail.dart'; +export 'package:video_compress/video_compress.dart'; +// export 'package:export_video_frame/export_video_frame.dart'; export 'package:flutter_localization/flutter_localization.dart'; export 'package:em_chat_uikit/universal/chat_uikit_log.dart';