You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI集成Azure Speech Service麦克风权限代码报错求助

.NET MAUI麦克风权限服务编译错误解决(MainActivity.Instance未定义)

你的编译错误源于.NET MAUI与旧Xamarin架构的差异:MAUI默认的MainActivity没有静态Instance属性,同时Android.Resource.Id.Content的引用方式也需要适配MAUI的布局结构。以下是可直接运行的修复方案:

核心修改点

  1. 替换MainActivity.Instance为MAUI官方提供的Platform.CurrentActivity,这是获取当前Activity的标准方式,无需手动维护静态实例。
  2. 调整Android.Resource.Id.Content的获取逻辑,适配MAUI的窗口布局结构。
  3. 完善权限请求的回调处理,确保权限结果能正确传递到MicrophoneService。

修复后的完整代码

1. 更新MicrophoneService

using Android.App;
using Android.Content.PM;
using Android.OS;
using AndroidX.Core.App;
using Google.Android.Material.Snackbar;
using System.Threading.Tasks;
using Atk.Progen.NETMAUI.Interfaces;
using System;
using Microsoft.Maui.ApplicationModel;

namespace Atk.Progen.NETMAUI.Platforms.Android
{
    public class MicrophoneService
    {
        public const int RecordAudioPermissionCode = 1;
        private TaskCompletionSource<bool> tcsPermissions;
        string[] permissions = new string[] { Android.Manifest.Permission.RecordAudio };

        public MicrophoneService()
        {
            tcsPermissions = new TaskCompletionSource<bool>();
        }

        public Task<bool> GetPermissionAsync()
        {
            if ((int)Build.VERSION.SdkInt < 23)
            {
                tcsPermissions.TrySetResult(true);
            }
            else
            {
                var currentActivity = Platform.CurrentActivity;
                if (ActivityCompat.CheckSelfPermission(currentActivity, Android.Manifest.Permission.RecordAudio) != (int)Permission.Granted)
                {
                    RequestMicPermissions();
                }
                else
                {
                    tcsPermissions.TrySetResult(true);
                }
            }

            return tcsPermissions.Task;
        }

        public void OnRequestPermissionResult(bool isGranted)
        {
            tcsPermissions.TrySetResult(isGranted);
        }

        void RequestMicPermissions()
        {
            var currentActivity = Platform.CurrentActivity;
            if (ActivityCompat.ShouldShowRequestPermissionRationale(currentActivity, Android.Manifest.Permission.RecordAudio))
            {
                // 适配MAUI布局,获取根视图
                var rootView = currentActivity.Window.DecorView.FindViewById(Android.Resource.Id.Content);
                Snackbar.Make(rootView,
                        "Microphone permissions are required for speech transcription!",
                        Snackbar.LengthIndefinite)
                        .SetAction("Ok", v =>
                        {
                            currentActivity.RequestPermissions(permissions, RecordAudioPermissionCode);
                        })
                        .Show();
            }
            else
            {
                ActivityCompat.RequestPermissions(currentActivity, permissions, RecordAudioPermissionCode);
            }
        }
    }
}

2. 配置MainActivity权限回调

打开Platforms/Android/MainActivity.cs,重写权限请求结果方法,将结果传递给MicrophoneService:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Microsoft.Maui;

namespace Atk.Progen.NETMAUI.Platforms.Android
{
    [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
    public class MainActivity : MauiAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            
            if (requestCode == MicrophoneService.RecordAudioPermissionCode)
            {
                bool isGranted = grantResults.Length > 0 && grantResults[0] == Permission.Granted;
                // 通过依赖注入获取MicrophoneService实例
                var microphoneService = MauiProgram.Current.Services.GetService<MicrophoneService>();
                microphoneService?.OnRequestPermissionResult(isGranted);
            }
        }
    }
}

3. 注册服务到依赖注入容器

打开MauiProgram.cs,将MicrophoneService注册为单例:

using Microsoft.Maui.LifecycleEvents;
using Atk.Progen.NETMAUI.Platforms.Android;

namespace Atk.Progen.NETMAUI
{
    public static class MauiProgram
    {
        public static MauiApp Current { get; private set; }

        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });

            // 注册MicrophoneService为单例
            builder.Services.AddSingleton<MicrophoneService>();

            Current = builder.Build();
            return Current;
        }
    }
}

关键说明

  • Platform.CurrentActivity是MAUI提供的全局获取当前Activity的API,替代了Xamarin时代手动维护MainActivity.Instance的方式,更符合MAUI的生命周期管理。
  • 权限回调依赖依赖注入容器获取MicrophoneService实例,确保服务实例的一致性。
  • 根视图的获取改用currentActivity.Window.DecorView.FindViewById(Android.Resource.Id.Content),适配MAUI的窗口布局结构。

内容的提问来源于stack exchange,提问作者felice.iorillo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:05:12