我对移动开发和Xamarin还是陌生的。
我创建了一个新的Xamarin.Forms解决方案“ AndroidApp1”,默认情况下,该解决方案由“ AndroidApp1.Android”和“ AndroidApp1”两个项目组成。
如果我正确理解了所读内容,则第一个包含适用于Android的代码,第二个包含可在Android,iOS或Windows Phone中使用的代码。
我的解决方案在调试模式下以Android仿真运行,现在我想在有来电时得到通知,我想获取正在打给我的电话号码。
Google告诉我,我需要创建一个从BroadcastReceiver
继承并覆盖OnReceive
函数的类。
我假定此类需要驻留在Android特定项目(AndroidApp1.Android)中,所以我在这里创建了该类,但是现在呢? 我找不到有关如何处理此类的任何信息?我在哪里实例化它?如何在我的“ AndroidApp1”项目中获得通知和要响应的电话号码?
这是我的BroadcastReceiver
(从互联网复制)的源代码:
[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "android.intent.action.PHONE_STATE" })]
public class IncomingCallReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
// ensure there is information
if (intent.Extras != null)
{
// get the incoming call state
string state = intent.GetStringExtra(TelephonyManager.ExtraState);
// check the current state
if (state == TelephonyManager.ExtraStateRinging)
{
// read the incoming call telephone number...
string telephone = intent.GetStringExtra(TelephonyManager.ExtraIncomingNumber);
// check the reade telephone
if (string.IsNullOrEmpty(telephone))
telephone = string.Empty;
}
else if (state == TelephonyManager.ExtraStateOffhook)
{
// incoming call answer
}
else if (state == TelephonyManager.ExtraStateIdle)
{
// incoming call end
}
}
}
}
答案 0 :(得分:0)
您需要为广播状态注册广播接收器。
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
并在收到广播事件后创建通知。
确保您已定义权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
答案 1 :(得分:0)
您需要具有一个类似的广播接收器。
/**
* Listener to detect incoming calls.
*/
private class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// called when someone is ringing to this phone
Toast.makeText(ctx, "Incoming: "+incomingNumber,
Toast.LENGTH_LONG).show();
break;
}
}
You can register the lister for incoming call events.
tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);
Here is the more info
https://stackoverflow.com/questions/9684866/how-to-detect-when-phone-is-answered-or-rejected
答案 2 :(得分:0)
最后,我向前迈出了一步。我创建了一个类let resultHtml = this.cinema.map(function(cineObj) {
return cineObj.cinema_loc;
}).join(', ');
,该类继承自Android特定项目中的StateListener
,如下所示:
PhoneStateListener
然后,我使用以下三行代码在Android特定项目的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;
}
}
}
类的OnCreate
类的MainActivity
函数中实例化了该类:
StateListener phoneStateListener = new StateListener();
TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService);
telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);
现在,当我在case
的{{1}}的{{1}}的{{1}}部分中设置断点时,它们会中断,但是switch (state)
始终为空,尽管我已经设置了清单中的相应权利。
所以,这就是我下一步要获取电话号码的情况。