有人打电话时获得通知

时间:2018-10-11 12:43:36

标签: android xamarin.forms xamarin.android

我对移动开发和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
            }
        }
    }
}

3 个答案:

答案 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)始终为空,尽管我已经设置了清单中的相应权利。

所以,这就是我下一步要获取电话号码的情况。