在MAUI android (net6-android)库中获取当前的Android活动

3

我有一个用于Xamarin.Forms(Android)的库,允许使用NFC,以下是代码:

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 XAMARINANDROID
         var activity = Forms.Context as Activity;
         NfcAdapter?.EnableReaderMode(activity, this, NfcReaderFlags.NfcA | NfcReaderFlags.NfcB | NfcReaderFlags.NfcF | NfcReaderFlags.NfcV | NfcReaderFlags.SkipNdefCheck, Bundle.Empty);
#else
         var activity = ?????????????????;
         NfcAdapter?.EnableReaderMode(activity , this, NfcReaderFlags.NfcA | NfcReaderFlags.NfcB | NfcReaderFlags.NfcF | NfcReaderFlags.NfcV | NfcReaderFlags.SkipNdefCheck, Bundle.Empty);
#endif

        MediaAdded += mediaAdded;
        MediaRemoved += mediaRemoved;
    }
}

我该如何替换var activity = Forms.Context as Activity这行代码以获取当前活动并能够在没有使用Xamarin Forms的情况下调用NfcAdapter?.EnableReaderMode?

否则,还有其他解决方案吗?


1
在 Xamarin Forms 中,我使用了 CrossCurrentActivity Nuget,它提供了我所需的一切。但我不知道它是否在 MAUI 中得到支持... - o_w
2个回答

5

这是包含在Xamarin.Essentials中的。

Xamarin.Essentials.Platform.CurrentActivity

Essentials已经移植到了.Net Maui。

Platform.CurrentActivity

1
我最终采用了这个解决方案:https://gist.github.com/BrunoVT1992/8c858e4fed85d5dd96098c012a6e0708
using System.Collections.Generic;
using System.Linq;
using Android.Runtime;
using Android.Util;
using Java.Lang;
using Java.Util;

namespace Droid
{
    public static class CurrentActivityUtil
    {
        /// <summary>
    /// Gets the current activity of the application (must run on the UI thread for older Android versions).
    /// </summary>
    /// <returns>The current activity.</returns>
    /// <param name="app">App.</param>
        public static Activity GetCurrentActivity()
        {
            Activity activity = null;
            List<Object> objects = null;

            var activityThreadClass = Class.ForName("android.app.ActivityThread");
            var activityThread = activityThreadClass.GetMethod("currentActivityThread").Invoke(null);
            var activityFields = activityThreadClass.GetDeclaredField("mActivities");
            activityFields.Accessible = true;

            var obj = activityFields.Get(activityThread);

            if (obj is JavaDictionary)
            {
                var activities = (JavaDictionary)obj;
                objects = new List<Object>(activities.Values.Cast<Object>().ToList());
            }
            else if (obj is ArrayMap)
            {
                var activities = (ArrayMap)obj;
                objects = new List<Object>(activities.Values().Cast<Object>().ToList());
            }
            else if (obj is IMap)
            {
                var activities = (IMap)activityFields.Get(activityThread);
                objects = new List<Object>(activities.Values().Cast<Object>().ToList());
            }

            if (objects != null && objects.Any())
            {
                foreach (var activityRecord in objects)
                {
                    var activityRecordClass = activityRecord.Class;
                    var pausedField = activityRecordClass.GetDeclaredField("paused");
                    pausedField.Accessible = true;

                    if (!pausedField.GetBoolean(activityRecord))
                    {
                        var activityField = activityRecordClass.GetDeclaredField("activity");
                        activityField.Accessible = true;
                        activity = (Activity)activityField.Get(activityRecord);
                        break;
                    }
                }
            }

            return activity;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接