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

如何在Xamarin共享项目中获取Activity调用NfcFCardEmulation.EnableService

在Xamarin共享项目中获取Activity以调用NfcFCardEmulation.EnableService

我正在使用Xamarin开发支持HCE功能的应用,项目结构如下:

  • hceSample(共享项目)
  • hceSample.Android
  • hceSample.iOS

我在共享项目hceSample中实现了名为hceService的HCE模拟代码,而非在Android项目中。该服务的enable_Card方法需要调用NfcFCardEmulation.EnableService,此方法要求传入Activity和ComponentName作为参数。目前ComponentName已处理完成,但不知道如何获取Activity,请求指导。

我的hceService中enable_Card方法代码如下:

private Activity activity = null;
private bool enable_Card(cardModel card)
{
    try
    {
        sid = card.cardSN;
        tag = "Felica";
        emulation.EnableService(, componentName); //<- 如何获取Activity??
        emulation.SetNfcid2ForService(componentName, sid);

        return true;
    }
    catch
    {
        return false;
    }
}

补充信息:Enable_Card方法的命名空间为hceSample.Service。

我尝试过的方法:

  • activity = Xamarin.Essentials.Platform.CurrentActivity; <- 找不到此方法!

这是我第一次提问,若有信息缺失或表述不当之处,欢迎指出。


解决方案

1. 通过构造函数传递Activity(推荐)

在共享项目的hceService中添加接收Activity的构造函数,在Android项目的入口Activity(如MainActivity)初始化hceService时传入当前Activity实例:

共享项目hceService修改:

private Activity _activity;

// 新增构造函数
public hceService(Activity activity)
{
    _activity = activity;
}

private bool enable_Card(cardModel card)
{
    try
    {
        sid = card.cardSN;
        tag = "Felica";
        emulation.EnableService(_activity, componentName); // 使用传入的Activity
        emulation.SetNfcid2ForService(componentName, sid);

        return true;
    }
    catch
    {
        return false;
    }
}

Android项目MainActivity中初始化:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // 初始化hceService时传入当前Activity
    var hceService = new hceSample.Service.hceService(this);
}

2. 通过自定义Application类维护当前Activity

在Android项目中自定义Application类,维护静态属性存储当前Activity,在Activity的生命周期方法中更新:

Android项目自定义Application:

[Application]
public class MyApplication : Application
{
    public static Activity CurrentActivity { get; set; }

    public MyApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
    {
    }
}

在Android项目的所有Activity中更新CurrentActivity:

protected override void OnResume()
{
    base.OnResume();
    MyApplication.CurrentActivity = this;
}

protected override void OnPause()
{
    base.OnPause();
    MyApplication.CurrentActivity = null;
}

共享项目中使用:

private bool enable_Card(cardModel card)
{
    try
    {
        sid = card.cardSN;
        tag = "Felica";
        var currentActivity = (Activity)hceSample.Droid.MyApplication.CurrentActivity;
        emulation.EnableService(currentActivity, componentName);
        emulation.SetNfcid2ForService(componentName, sid);

        return true;
    }
    catch
    {
        return false;
    }
}

3. 修复Xamarin.Essentials的CurrentActivity问题

如果坚持使用Xamarin.Essentials,需要:

  • 确保已安装最新版的Xamarin.Essentials NuGet包
  • 在Android项目的MainActivity中初始化Essentials:
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState); // 必须添加此行
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

之后即可在共享项目中调用Xamarin.Essentials.Platform.CurrentActivity获取当前Activity。


内容的提问来源于stack exchange,提问作者user18501010

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:40:31