在 Xamarin 中获取 phone 状态

Getting phone state in Xamarin

我有以下代码:

public class StateListener : PhoneStateListener
    {
        StateListener phoneStateListener = new StateListener();
        TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService);
        telephonyManager.Listen(phoneStateListender, PhoneStateListenerFlags.CallState);

        public void onCallStateChanged(CallState state, String incomingNumber)
        {
            base.OnCallStateChanged(state, incomingNumber);
            switch (state)
            {
                case CallState.Ringing:
                    break;
                case CallState.Offhook:
                    break;
                case CallState.Idle:
                    break;
            }
        }
    }

这是一个内部 class 因为我的基础 class 是 "MainActivity : Activity"。上面的代码来自Java,所以我尝试将其转换为C#。但是,在这种情况下出现错误:

 (TelephonyManager)GetSystemService(Context.TelephonyService); 

抛出字段初始值设定项必须是静态的错误并且

 telephonyManager.Listen(phoneStateListender, PhoneStateListenerFlags.CallState);

在此上下文中不可用。我什至不知道上面的代码是否有效。 如何在Xamarin中实现获取拨出电话的状态?

您必须将创建代码移动到 Activity 的 OnCreate 方法中。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);

    StateListener phoneStateListener = new StateListener();
    TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService);
    telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);
}

然后你可以创建 class:

public class StateListener : PhoneStateListener
{
    public override void OnCallStateChanged(CallState state, string incomingNumber)
    {
        base.OnCallStateChanged(state, incomingNumber);
        switch (state)
        {
            case CallState.Ringing:
                break;
            case CallState.Offhook:
                break;
            case CallState.Idle:
                break;
        }
    }
}

如果你想在OnCallStateChanged之后对你activity做点什么,你必须传递activity(例如在构造函数中):

public class StateListener : PhoneStateListener
{
    private readonly MainActivity _activity;

    public StateListener(MainActivity activity)
    {
        _activity = activity;
    }

    public override void OnCallStateChanged(CallState state, string incomingNumber)
    {
        base.OnCallStateChanged(state, incomingNumber);
        _activity.UpdateCallState(state, incomingNumber);
    }
}

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        StateListener phoneStateListener = new StateListener(this);
        TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService);
        telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);
    }

    public void UpdateCallState(CallState state, string incomingNumber)
    {
        // numberLabel.Text = ...
    }
}