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

在.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 类库场景:

  1. 先创建一个全局的 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;
        }
    }
}
  1. 在 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跟踪
    }
}
  1. 最后在你的 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:17:30