在.NET6-Android的MAUI类库中获取当前Android Activity以调用NfcAdapter.EnableReaderMode的解决方案
解决方案:在MAUI Android中获取当前Activity以启用NFC Reader模式
首先,MAUI 不再提供 Forms.Context 这类全局上下文对象,我们有两种可靠的方式来获取当前 Activity,完全不需要依赖 Xamarin.Forms:
方案一:使用 MAUI 内置的 Platform API
这是最简单直接的方式,MAUI 专门提供了 Microsoft.Maui.ApplicationModel.Platform 命名空间,其中的 CurrentActivity 属性可以直接拿到当前活跃的 Activity,适合大多数 MAUI 场景。
修改你的代码如下:
using Microsoft.Maui.ApplicationModel.Platform; // 记得添加这个命名空间 public class MediaAccessReader : Java.Lang.Object, NfcAdapter.IReaderCallback { public const string TypeName = "Nfc"; private static NfcAdapter NfcAdapter { get; } = NfcAdapter.GetDefaultAdapter(Android.App.Application.Context); public string Name { get; set; } public void Initialize(MediaAddedEventHandler mediaAdded, MediaRemovedEventHandler mediaRemoved) { Name = "Nfc"; #if ANDROID // MAUI 中 Android 的条件编译符号是 ANDROID,替换原有的 XAMARINANDROID var activity = Platform.CurrentActivity; // 替换原来的 Forms.Context 逻辑 NfcAdapter?.EnableReaderMode(activity, this, NfcReaderFlags.NfcA | NfcReaderFlags.NfcB | NfcReaderFlags.NfcF | NfcReaderFlags.NfcV | NfcReaderFlags.SkipNdefCheck, Bundle.Empty); #endif MediaAdded += mediaAdded; MediaRemoved += mediaRemoved; } // 别忘了实现 IReaderCallback 要求的 OnTagDiscovered 方法(这里省略你的原有业务逻辑) public void OnTagDiscovered(Tag tag) { // 处理NFC标签发现后的逻辑 } }
注:这个方式默认依赖 MAUI 自带的 Microsoft.Maui.ApplicationModel 包,一般新建 MAUI 项目都会自动包含。
方案二:通过 Android 生命周期回调跟踪当前 Activity
如果你的类库需要更独立,不想绑定 MAUI 的 Platform API,可以通过注册 Android 原生的 ActivityLifecycleCallbacks 来全局跟踪当前 Activity,这种方式更底层,适合纯 Android 类库场景:
- 先创建一个全局的 Activity 跟踪类:
using Android.App; using Android.Content; public static class CurrentActivityTracker { public static Activity CurrentActivity { get; private set; } public static void Initialize() { Android.App.Application.Context.RegisterActivityLifecycleCallbacks(new ActivityLifecycleCallbacksImpl()); } private class ActivityLifecycleCallbacksImpl : Java.Lang.Object, Application.IActivityLifecycleCallbacks { public void OnActivityCreated(Activity activity, Bundle savedInstanceState) => CurrentActivity = activity; public void OnActivityStarted(Activity activity) => CurrentActivity = activity; public void OnActivityResumed(Activity activity) => CurrentActivity = activity; public void OnActivityPaused(Activity activity) {} public void OnActivityStopped(Activity activity) {} public void OnActivitySaveInstanceState(Activity activity, Bundle outState) {} public void OnActivityDestroyed(Activity activity) { if (CurrentActivity == activity) CurrentActivity = null; } } }
- 在 MAUI 项目的 Android 入口(比如
MainApplication.cs的OnCreate方法)初始化跟踪器:
public class MainApplication : MauiApplication { public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership) { } protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); public override void OnCreate() { base.OnCreate(); CurrentActivityTracker.Initialize(); // 初始化全局Activity跟踪 } }
- 最后在你的
MediaAccessReader类中使用:
public void Initialize(MediaAddedEventHandler mediaAdded, MediaRemovedEventHandler mediaRemoved) { Name = "Nfc"; #if ANDROID var activity = CurrentActivityTracker.CurrentActivity; if (activity != null) { NfcAdapter?.EnableReaderMode(activity, this, NfcReaderFlags.NfcA | NfcReaderFlags.NfcB | NfcReaderFlags.NfcF | NfcReaderFlags.NfcV | NfcReaderFlags.SkipNdefCheck, Bundle.Empty); } #endif MediaAdded += mediaAdded; MediaRemoved += mediaRemoved; }
额外注意事项
- 确保你的 Android 项目的
AndroidManifest.xml中声明了必要的 NFC 权限和功能:<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="false" /> - 记得在 Activity 销毁或者类释放时,调用
NfcAdapter?.DisableReaderMode(activity)来释放资源,避免内存泄漏。你可以在 Activity 的OnDestroy方法或者类的Dispose方法中处理这个逻辑。
内容的提问来源于stack exchange,提问作者Gab
相关产品推荐
相关产品推荐

