前言
在 Android 中编写一个全局可调用的播放音频的单例工具类,可以借助 object 关键字实现单例,并封装 MediaPlayer 的常用操作(如播放、暂停、停止等)。
工具类
1 | import android.content.Context |
使用示例
播放
播放网络音频
1 | val uri = Uri.parse("https://example.com/sound.mp3") |
或者
1 | val url = "https://example.com/sound.mp3" |
播放 raw 资源
1 | ZAudioPlayer.playRaw(applicationContext, R.raw.click_sound) |
播放 assets 文件
1 | ZAudioPlayer.playAsset(applicationContext, "notification.mp3") |
暂停 / 停止
1 | ZAudioPlayer.pause() |
Compose中使用
viewModel中定义
1 | fun playAudio(applicationContext: android.content.Context, url: String) { |
Compose中调用
获取上下文
1 | val context = LocalContext.current |
调用
1 | vm.playAudio(appContext, url) |
页面销毁时停止播放
1 | DisposableEffect(Unit) { |
全局appContext
定义
1 | val LocalAppContext = compositionLocalOf<Context> { |
提供
1 | val context = LocalContext.current |
使用
1 | val appContext = LocalAppContext.current |
注意事项
上下文建议使用 applicationContext,防止内存泄漏。
如果需要同时播放多个音频,此单例不适用(因为只维护一个 MediaPlayer 实例)。
对于短音效(如按钮点击声),建议使用 SoundPool;对于背景音乐或长音频,MediaPlayer 更合适。
网络音频需添加网络权限:
1 | <uses-permission android:name="android.permission.INTERNET" /> |