.NET MAUI麦克风输入获取求助:Android平台API常量定义报错
.NET MAUI麦克风输入问题解决方案
错误原因分析
你遇到的MIC、THREE_GPP、AMR_NB常量找不到的问题,本质是.NET MAUI在绑定Android原生API时,会将Java全大写的常量名转换为符合.NET命名规范的驼峰命名。对应关系如下:
- 原生Android
MediaRecorder.AudioSource.MIC→ .NET MAUIAudioSource.Mic - 原生Android
MediaRecorder.OutputFormat.THREE_GPP→ .NET MAUIOutputFormat.ThreeGpp - 原生Android
MediaRecorder.AudioEncoder.AMR_NB→ .NET MAUIAudioEncoder.AmrNb
修正后的代码片段:
using Android.Media; using Java.Util; using System.Diagnostics; public static class MicIn { static MediaRecorder mRecorder; public static void StartRecorder() { if (mRecorder == null) { mRecorder = new MediaRecorder(); mRecorder.SetAudioSource(AudioSource.Mic); mRecorder.SetOutputFormat(OutputFormat.ThreeGpp); mRecorder.SetAudioEncoder(AudioEncoder.AmrNb); mRecorder.SetOutputFile("/dev/null"); try { mRecorder.Prepare(); } catch (Java.IO.IOException ioe) { Debug.WriteLine("IO exception: " + ioe.Message); } catch (Java.Lang.SecurityException e) { Debug.WriteLine("Security exception: " + e.Message); } try { mRecorder.Start(); } catch (Java.Lang.SecurityException e) { Debug.WriteLine("Security exception when starting recorder: " + e.Message); } } } }
.NET MAUI中获取麦克风输入的替代方案
1. 跨平台音频插件(推荐)
使用Plugin.Maui.Audio插件,它提供了跨平台的音频录制与实时数据处理能力,无需编写平台专属代码:
- 安装NuGet包:
Plugin.Maui.Audio - 在
MauiProgram.cs中注册服务:builder.Services.AddAudio(); - 注入
IAudioManager并实现实时音量监测:using Plugin.Maui.Audio; public class AudioMonitor { private readonly IAudioManager _audioManager; private IAudioRecorder _recorder; public AudioMonitor(IAudioManager audioManager) { _audioManager = audioManager; } public async Task StartMonitoring() { // 请求麦克风权限 var status = await Permissions.RequestAsync<Permissions.Microphone>(); if (status != PermissionStatus.Granted) { Debug.WriteLine("麦克风权限未授予"); return; } _recorder = _audioManager.CreateRecorder(); _recorder.RecordingAvailable += (s, e) => { // 处理实时音频数据,计算音量 var audioBuffer = e.Buffer; // 示例:计算音频振幅(音量) float amplitude = CalculateAmplitude(audioBuffer); Debug.WriteLine($"当前音量振幅:{amplitude}"); }; await _recorder.StartAsync(); } private float CalculateAmplitude(float[] audioBuffer) { float maxAmplitude = 0; foreach (var sample in audioBuffer) { maxAmplitude = Math.Max(maxAmplitude, Math.Abs(sample)); } return maxAmplitude; } }
2. 完善平台专属代码(Android)
如果坚持使用Android原生API,除了修正常量名,还需确保权限配置完整:
- 在
Platforms/Android/AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.RECORD_AUDIO" /> - 在运行时动态请求麦克风权限:
var permissionStatus = await Permissions.RequestAsync<Permissions.Microphone>(); if (permissionStatus != PermissionStatus.Granted) { // 处理权限未授予的情况 return; }
内容的提问来源于stack exchange,提问作者Kamilo Tomas
相关产品推荐
相关产品推荐

