在 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 = ...
}
}
我有以下代码:
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 = ...
}
}