【问题标题】:Getting phone state in Xamarin在 Xamarin 中获取电话状态
【发布时间】:2017-08-24 17:46:47
【问题描述】:

我有以下代码:

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;
            }
        }
    }

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

 (TelephonyManager)GetSystemService(Context.TelephonyService); 

抛出一个错误,字段初始化器必须是静态的并且

 telephonyManager.Listen(phoneStateListender, PhoneStateListenerFlags.CallState);

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

【问题讨论】:

    标签: android xamarin listener telephonymanager


    【解决方案1】:

    您必须将创建代码移动到 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);
    }
    

    然后你就可以创建类了:

    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 之后对你的活动做一些事情,你必须传递活动(例如在构造函数中):

    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 = ...
        }
    }
    

    【讨论】:

    • 对不起。我在代码中有错误。谢谢您的帮助!现在可以了!
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多