Flutter使用audioplayers播放音频 模拟器正常安卓实体机无声音
修复Android实体机音频无输出的方案
- 调整播放器实例的定义位置
你当前将AudioCache实例定义在build方法中,每次页面触发重绘都会生成新的播放器实例,极易导致音频资源加载异常,建议调整为State类的全局成员变量,同时添加资源预加载和释放逻辑,修改后的代码如下:
import 'package:flutter/material.dart'; import 'package:audioplayers/audioplayers.dart'; void main() => runApp(MartinApp()); class MartinApp extends StatefulWidget { @override _MartinAppState createState() => _MartinAppState(); } class _MartinAppState extends State<MartinApp> { final AudioCache player = AudioCache(); late AudioPlayer audioPlayer; @override void initState() { super.initState(); audioPlayer = AudioPlayer(); // 预加载音频资源,避免首次点击加载延迟 player.load('55.mp3'); // 强制指定音频播放参数,适配实体机 audioPlayer.setAudioContext( AudioContext( android: AudioContextAndroid( isSpeakerphoneOn: true, stayAwake: true, contentType: AndroidContentType.music, usageType: AndroidUsageType.media, audioFocus: AndroidAudioFocus.gain, ), ), ); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: SafeArea( child: Center( child: ElevatedButton( onPressed: () async { // 停止之前的播放避免冲突 await audioPlayer.stop(); await player.play('55.mp3', volume: 1, player: audioPlayer); }, child: Text('press here'))), ), ), ); } @override void dispose() { // 释放播放器资源 audioPlayer.dispose(); super.dispose(); } }
如果使用的是4.x及以上版本的audioplayers,AudioCache已整合为新的资源加载方式,可简化写法为:
onPressed: () async { await audioPlayer.stop(); await audioPlayer.play(AssetSource('55.mp3'), volume: 1); }
检查基础配置
- 确认
android/app/build.gradle中的minSdkVersion不低于16,高版本audioplayers建议设置为21以上避免兼容问题 - 确认pubspec.yaml中已正确声明assets资源目录,配置示例:
flutter: assets: - assets/55.mp3- 确认
实体机环境排查
- 确认实体机未开启勿扰/静音模式,且媒体音量已打开(注意部分设备静音模式会强制关闭媒体音量,通话音量和媒体音量是独立控制的)
- 尝试替换其他标准编码的mp3文件测试,部分特殊编码的音频仅支持模拟器软件解码,实体机硬件解码不兼容,可转码为通用mp3格式后重试
内容的提问来源于stack exchange,提问作者Norsak
相关产品推荐
相关产品推荐

