提交 36fab99c authored 作者: yueweilu's avatar yueweilu

音频录制

上级 47ead385
...@@ -38,18 +38,23 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -38,18 +38,23 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
List <String> discussInputImages= []; List <String> discussInputImages= [];
// 讨论添加的语音path数组 // 讨论添加的语音path数组
List <String> discussInputAudios= []; List <String> discussInputAudios= [];
// 笔记标题 // 笔记标题
String noteTitle = ''; String noteTitle = '';
bool _show = true; bool _show = true;
bool get show => _show; bool get show => _show;
// 录音
final FlutterSoundRecorder _mRecorder = FlutterSoundRecorder();
// 录音开始
bool startRecording = false;
///------------------------------------------ 页面 生命周期-------------------------------------------------------- ///------------------------------------------ 页面 生命周期--------------------------------------------------------
@override @override
void onInit() { void onInit() {
discussTitleFocusNode.addListener(_onCommentFocusChanged); discussTitleFocusNode.addListener(_onCommentFocusChanged);
openTheRecorder();
super.onInit(); super.onInit();
} }
...@@ -78,6 +83,65 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -78,6 +83,65 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
update(); update();
} }
// 初始化录音组件
Future<void> openTheRecorder() async {
// 获取权限
if(await Access.microphone()){
await _mRecorder.openRecorder();
final session = await AudioSession.instance;
await session.configure(AudioSessionConfiguration(
avAudioSessionCategory: AVAudioSessionCategory.playAndRecord,
avAudioSessionCategoryOptions:
AVAudioSessionCategoryOptions.allowBluetooth |
AVAudioSessionCategoryOptions.defaultToSpeaker,
avAudioSessionMode: AVAudioSessionMode.spokenAudio,
avAudioSessionRouteSharingPolicy:
AVAudioSessionRouteSharingPolicy.defaultPolicy,
avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none,
androidAudioAttributes: const AndroidAudioAttributes(
contentType: AndroidAudioContentType.speech,
flags: AndroidAudioFlags.none,
usage: AndroidAudioUsage.voiceCommunication,
),
androidAudioFocusGainType: AndroidAudioFocusGainType.gain,
androidWillPauseWhenDucked: true,
));
}
// 没有权限
else {
}
}
// 开启录音
void record() async {
startRecording = true;
String filePath = await _getDocumentsDirectory();
_mRecorder.startRecorder(
toFile: '$filePath/tau_file.mp4',
audioSource: AudioSource.microphone,
codec: Codec.aacMP4,
);
_mRecorder?.setSubscriptionDuration(Duration(milliseconds: 100));
_mRecorder?.onProgress?.listen((e)
{
var date = DateTime.fromMillisecondsSinceEpoch(e.duration.inMilliseconds,isUtc: true);
var text = DateFormat('mm:ss:').format(date);
print('--------------$text');
});
update();
}
// 停止录音
void stopRecorder() async{
startRecording = false;
_mRecorder.stopRecorder().then((value){
print('------value-------------------$value---------------------------------------');
});
update();
}
// 添加讨论图片 // 添加讨论图片
void addDiscussInputImages(String path){ void addDiscussInputImages(String path){
discussInputImages.add(path); discussInputImages.add(path);
...@@ -321,10 +385,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -321,10 +385,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
} }
//获取存储目录 //获取存储目录
Future<String> _getDocumentsDirectory() async { Future<String> _getDocumentsDirectory() async {
final directory = await getApplicationDocumentsDirectory(); final directory = await getExternalStorageDirectory();
return directory.path; return directory!.path;
} }
///------------------------------------------ app 生命周期-------------------------------------------------------- ///------------------------------------------ app 生命周期--------------------------------------------------------
...@@ -369,3 +435,4 @@ class ToolModel { ...@@ -369,3 +435,4 @@ class ToolModel {
String icon; String icon;
String activeIcon; String activeIcon;
} }
...@@ -3,16 +3,22 @@ library web; ...@@ -3,16 +3,22 @@ library web;
import 'dart:convert'; import 'dart:convert';
import 'package:audio_session/audio_session.dart';
import 'package:easy_refresh/easy_refresh.dart'; import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_book/theme.dart'; import 'package:flutter_book/theme.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_book/utils/index.dart'; import 'package:flutter_book/utils/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_sound/public/flutter_sound_recorder.dart';
import 'package:flutter_sound_platform_interface/flutter_sound_platform_interface.dart';
import 'package:flutter_sound_platform_interface/flutter_sound_recorder_platform_interface.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'dart:async';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import '../../apis/index.dart'; import '../../apis/index.dart';
import '../../models/index.dart'; import '../../models/index.dart';
......
...@@ -174,9 +174,15 @@ class _ReadInputDiscussState extends State<ReadInputDiscuss> { ...@@ -174,9 +174,15 @@ class _ReadInputDiscussState extends State<ReadInputDiscuss> {
Gaps.hGaps10, Gaps.hGaps10,
GestureDetector( GestureDetector(
onTap: () async { onTap: () async {
if(widget.controller.startRecording){
widget.controller.stopRecorder();
}
else {
widget.controller.record();
}
}, },
child: Image.asset('assets/images/read_add_audio.png') child: Image.asset(widget.controller.startRecording?'assets/images/stop.png':'assets/images/read_add_audio.png')
), ),
widget.controller.chatType ==0?const SizedBox():GestureDetector( widget.controller.chatType ==0?const SizedBox():GestureDetector(
onTap: (){ onTap: (){
......
...@@ -31,4 +31,10 @@ abstract class Access { ...@@ -31,4 +31,10 @@ abstract class Access {
return result[Permission.storage] == PermissionStatus.granted; return result[Permission.storage] == PermissionStatus.granted;
} }
/// 获取麦克风权限
static Future<bool> microphone() async {
final result = await [Permission.microphone].request();
return result[Permission.microphone] == PermissionStatus.granted;
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论