.NET MAUI实现Android设备播放简易蜂鸣音并控制时长
.NET MAUI Android平台实现可控时长系统蜂鸣音
解决方案:使用ToneGenerator实现精确控制
RingtoneManager仅适用于播放完整的铃声/通知音,无法精确控制播放时长,不适合摩尔斯电码训练场景。推荐使用Android原生的ToneGenerator类,它可以生成系统级蜂鸣音并支持精确启停控制。
代码实现
在页面事件或服务中添加以下代码(通过条件编译仅在Android平台生效):
private async void PlayMorseBeep(int durationMilliseconds) { #if ANDROID // 初始化ToneGenerator:指定音频流类型为音乐流,音量为100(范围0-100) using var toneGenerator = new Android.Media.ToneGenerator(Android.Media.Stream.Music, 100); // 选择系统蜂鸣音类型,可根据需求替换为其他Tone枚举值 var beepTone = Android.Media.Tone.CdmaPropBeep; // 启动蜂鸣音 if (toneGenerator.StartTone(beepTone)) { // 等待指定时长后停止蜂鸣 await Task.Delay(durationMilliseconds); toneGenerator.StopTone(); } #endif }
关键说明
- Tone类型选择:可以根据需求替换
CdmaPropBeep为其他系统蜂鸣音,例如:Tone.CdmaAlertCallGuard:短促提示音Tone.Dtmf0:DTMF拨号音0(类似蜂鸣)ToneGenerator.ToneCustom:自定义频率(需API 21+,如传入800Hz:StartTone(ToneGenerator.ToneCustom, 800))
- 资源释放:使用
using语句确保ToneGenerator在使用后被正确释放,避免音频资源泄漏 - 时长控制:通过
Task.Delay实现精确的蜂鸣时长控制,完全匹配摩尔斯电码的短点(通常100ms)、长划(通常300ms)需求
替代方案(仅短音效场景)
如果仅需播放固定时长的系统短音效,可使用AudioManager的PlaySoundEffect方法,但该方法无法主动停止音效,仅适用于时长较短的场景:
private async void PlayShortBeep() { #if ANDROID var audioManager = (Android.Media.AudioManager)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity .GetSystemService(Android.Content.Context.AudioService); // 播放系统点击音效 audioManager.PlaySoundEffect(Android.Media.SoundEffectKey.Click); #endif }
内容的提问来源于stack exchange,提问作者Terry Tyson
相关产品推荐
相关产品推荐

