From 505b55c0dcbf04fdb48d510e325164a9323ad79f Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 23 Jan 2025 19:08:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 5 +- lib/scenes/SoundRecordScene.dart | 158 +++++++++++++++++++++++++++++++ lib/scenes/TranslateScene.dart | 90 ------------------ 3 files changed, 160 insertions(+), 93 deletions(-) create mode 100644 lib/scenes/SoundRecordScene.dart delete mode 100644 lib/scenes/TranslateScene.dart diff --git a/lib/main.dart b/lib/main.dart index 778dd27..55dd33f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,6 @@ -import 'package:demo001/scenes/HomeScene.dart'; import 'package:flutter/material.dart'; -import 'scenes/TranslateScene.dart'; +import 'scenes/SoundRecordScene.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); @@ -20,7 +19,7 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), - home: SoundRecordPage(), + home: SoundRecordScene(), ); } } diff --git a/lib/scenes/SoundRecordScene.dart b/lib/scenes/SoundRecordScene.dart new file mode 100644 index 0000000..3774d05 --- /dev/null +++ b/lib/scenes/SoundRecordScene.dart @@ -0,0 +1,158 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_sound/flutter_sound.dart'; +import 'package:audioplayers/audioplayers.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class SoundRecordScene extends StatefulWidget { + @override + _SoundRecordSceneState createState() => _SoundRecordSceneState(); +} + +class _SoundRecordSceneState extends State { + FlutterSoundRecorder? _soundRecorder; + AudioPlayer? _audioPlayer; + String? _audioFilePath; + ScrollController _scrollController = ScrollController(); + List _logs = []; + + @override + void initState() { + super.initState(); + _soundRecorder = FlutterSoundRecorder(); + _audioPlayer = AudioPlayer(); + _requestPermissions(); + } + + // 请求麦克风权限 + void _requestPermissions() async { + try { + await Permission.microphone.request(); + } catch (e) { + _log('播放录音失败: $e'); + } + } + + // 开始录音 + void _startRecording() async { + try { + _log('录音开始'); + final tempPath = + '/data/user/0/com.example.flutter_app/cache/recorded_audio.aac'; // 可根据需要调整路径 + await _soundRecorder?.startRecorder( + toFile: tempPath, + codec: Codec.aacADTS, + ); + setState(() { + _audioFilePath = tempPath; + }); + } catch (e) { + _log('播放录音失败: $e'); + } + } + + // 停止录音 + void _stopRecording() async { + try { + await _soundRecorder?.stopRecorder(); + _log('录音停止'); + } catch (e) { + _log('播放录音失败: $e'); + } + } + + // 播放录音 + void _playRecording() async { + if (_audioFilePath != null) { + await _audioPlayer?.play(DeviceFileSource(_audioFilePath!)); + _log('播放录音'); + } + } + + // 添加日志信息并自动滚动 + void _log(String message) { + setState(() { + _logs.add(message); // 从顶部插入新日志 + }); + _scrollToBottom(); + } + + // 滚动到底部 + void _scrollToBottom() { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_scrollController.hasClients) { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, // 滚动到底部 + duration: Duration(milliseconds: 200), + curve: Curves.easeInOut, + ); + } + }); + } + + @override + void dispose() { + _soundRecorder?.closeRecorder(); + _audioPlayer?.dispose(); + _scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('录音与播放')), + body: Column( + children: [ + // 滑动面板(日志区域) + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.blue), + borderRadius: BorderRadius.circular(10), + ), + child: ListView.builder( + controller: _scrollController, + itemCount: _logs.length, + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 0.0), // 设置日志项间的垂直间距 + child: ListTile( + title: Text(_logs[index]), + ), + ); + }, + ), + ), + ), + ), + // 按钮区域 + GestureDetector( + onTapDown: (details) { + _startRecording(); // 按下时开始录音 + }, + onTapUp: (details) { + _stopRecording(); // 抬起时停止录音并播放 + _playRecording(); // 播放录音 + }, + child: Container( + margin: EdgeInsets.all(20), + padding: EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + child: Icon( + Icons.mic, + color: Colors.white, + size: 50, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/scenes/TranslateScene.dart b/lib/scenes/TranslateScene.dart deleted file mode 100644 index 3ac1edc..0000000 --- a/lib/scenes/TranslateScene.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_sound/flutter_sound.dart'; -import 'package:audioplayers/audioplayers.dart'; -import 'package:permission_handler/permission_handler.dart'; - -class SoundRecordPage extends StatefulWidget { - @override - _SoundRecordPageState createState() => _SoundRecordPageState(); -} - -class _SoundRecordPageState extends State { - FlutterSoundRecorder? _soundRecorder; - AudioPlayer? _audioPlayer; - String? _audioFilePath; - - @override - void initState() { - super.initState(); - _soundRecorder = FlutterSoundRecorder(); - _audioPlayer = AudioPlayer(); - _requestPermissions(); - } - - // 请求麦克风权限 - void _requestPermissions() async { - await Permission.microphone.request(); - } - - // 开始录音 - void _startRecording() async { - final tempPath = - '/data/user/0/com.example.flutter_app/cache/recorded_audio.aac'; // 可根据需要调整路径 - await _soundRecorder?.startRecorder( - toFile: tempPath, - codec: Codec.aacADTS, - ); - setState(() { - _audioFilePath = tempPath; - }); - } - - // 停止录音 - void _stopRecording() async { - await _soundRecorder?.stopRecorder(); - } - - // 播放录音 - void _playRecording() async { - if (_audioFilePath != null) { - await _audioPlayer?.play(DeviceFileSource(_audioFilePath!)); - } - } - - @override - void dispose() { - _soundRecorder?.closeRecorder(); - _audioPlayer?.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text('录音与播放')), - body: Center( - child: GestureDetector( - onTapDown: (details) { - _startRecording(); // 按下时开始录音 - }, - onTapUp: (details) { - _stopRecording(); // 抬起时停止录音并播放 - _playRecording(); // 播放录音 - }, - child: Container( - padding: EdgeInsets.all(20), - decoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - child: Icon( - Icons.mic, - color: Colors.white, - size: 50, - ), - ), - ), - ), - ); - } -}