|
- import 'dart:async';
- import 'dart:io';
- import 'dart:typed_data';
- import 'package:record/record.dart';
- import 'package:flutter/material.dart';
- import 'package:logger/logger.dart';
- import 'package:path_provider/path_provider.dart';
- import 'package:permission_handler/permission_handler.dart';
- import 'package:demo001/xunfei/xunfei_translate.dart';
-
- /*
- 录音测试场景
- */
- class RecordScene extends StatefulWidget {
- @override
- _RecordSceneState createState() => _RecordSceneState();
- }
-
- class _RecordSceneState extends State<RecordScene> {
- late Directory savedirectory;
-
- final XunFeiTranslate xunfei = XunFeiTranslate(
- appId: "137dc132",
- apiKey: "1c1891a475e71250ecd1320303ad6545",
- apiSecret: "MjZhNDA1NTI1NWZkZDQxOTMxYzMyN2Yw");
-
- AudioRecorder _recorder = AudioRecorder();
- bool _isRecorderReady = false; //是否录音已准备
- bool _isRecording = false; //是否录音中
-
- @override
- void initState() {
- super.initState();
- _requestPermissions();
- }
-
- // 初始化录音器
- void _initRecorder() async {
- try {
- // 获取外部存储目录路径
- savedirectory = (await getExternalStorageDirectory())!;
- setState(() {
- _isRecorderReady = true;
- });
- _log('录音器初始化成功');
- } catch (e) {
- _log('初始化录音器失败: $e');
- setState(() {
- _isRecorderReady = false;
- });
- }
- }
-
- // 请求麦克风权限
- void _requestPermissions() async {
- try {
- if (await Permission.microphone.request().isGranted) {
- _log('麦克风权限已授予');
- } else {
- _log('麦克风权限被拒绝');
- setState(() {
- _isRecorderReady = false;
- });
- }
- } catch (e) {
- _log('请求麦克风权限失败: $e');
- setState(() {
- _isRecorderReady = false;
- });
- }
- }
-
- // 切换按钮状态
- void _toggleCallStatus() {
- if (!_isRecording) {
- //开始通话
- _startRecorder();
- } else {
- //结束通话
- _stopRecorder();
- }
-
- setState(() {
- _isRecording = !_isRecording;
- });
- }
-
- //开始录音
- void _startRecorder() async {
- try {
- if (!_isRecorderReady) {
- _initRecorder();
- }
- if (_isRecording) return; // 防止重复调用
- Stream<Uint8List> dataStream = await _recorder.startStream(RecordConfig(
- sampleRate: 16000, encoder: AudioEncoder.pcm16bits, numChannels: 1));
- xunfei.starttranslate(dataStream);
- setState(() {
- _isRecording = true;
- });
- _log('录音开始');
- } catch (e) {
- _log('录音开始 异常: $e');
- }
- }
-
- //结束录音
- void _stopRecorder() async {
- try {
- if (!_isRecording) return; // 防止重复调用
- await _recorder.stop();
- await _recorder.cancel();
- xunfei.stoptranslate();
- setState(() {
- _isRecorderReady = false;
- _isRecording = false;
- });
- _log('录音停止');
- } catch (e) {
- _log('录音停止 异常: $e');
- }
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: Text("录音测试")),
- // body: ListView.builder(
- // itemCount: _records.length,
- // itemBuilder: (context, index) {
- // var audio = _records[index];
- // return _buildAudioMessage(audio);
- // },
- // ),
- bottomNavigationBar: Padding(
- padding: const EdgeInsets.all(20.0),
- child: InkWell(
- onTap: _toggleCallStatus,
- child: Container(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(30), // 圆角按钮
- color: _isRecording
- ? Colors.red
- : Colors.green, // 通话状态红色,非通话状态绿色
- ),
- padding: EdgeInsets.symmetric(
- vertical: 15, horizontal: 40), // 调整按钮大小
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- Icon(
- _isRecording ? Icons.call_end : Icons.mic, // 图标变化
- color: Colors.white,
- size: 30,
- ),
- SizedBox(width: 10),
- Text(
- _isRecording ? '挂断' : '开始通话', // 状态文字变化
- style: TextStyle(
- color: Colors.white,
- fontSize: 18,
- ),
- ),
- ],
- ),
- ))),
- );
- }
-
- // 构建语音消息
- // Widget _buildAudioMessage(RecordData data) {
- // Color buttColor = data.state == 0 ? Colors.red : Colors.green;
- // return Padding(
- // padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15),
- // child: Column(
- // crossAxisAlignment: CrossAxisAlignment.start,
- // children: [
- // // 音频播放按钮
- // GestureDetector(
- // onTap: () {
- // // _playRecording(data);
- // },
- // child: Container(
- // padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20),
- // decoration: BoxDecoration(
- // color: buttColor,
- // borderRadius: BorderRadius.circular(30),
- // ),
- // child: Row(
- // children: [
- // Icon(
- // Icons.play_arrow,
- // color: Colors.white,
- // ),
- // SizedBox(width: 10),
- // Text(
- // '播放音频',
- // style: TextStyle(color: Colors.white),
- // ),
- // ],
- // ),
- // ),
- // ),
- // SizedBox(height: 5),
- // // 文字内容
- // // Text(
- // // message['text'],
- // // style: TextStyle(fontSize: 16),
- // // ),
- // ],
- // ),
- // );
- // }
-
- void _log(String msg) {
- Logger().f("LIWEI---------------:$msg");
- }
- }
|