Получать уведомление, когда кто-то звонит

Я новичок в мобильной разработке и в 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
468
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам необходимо зарегистрировать широковещательный приемник для состояния вызова.

  <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"/>

Не могли бы вы объяснить немного подробнее? Где (в каком файле, в каком проекте) зарегистрировать tie broadcastreveiver? Где (в каком файле, в каком проекте) мне запрашивать разрешения? Что мне делать с моим классом IncomingCallReceiver после его регистрации? Где мне его создать? Как мне получить информацию из класса IncomingCallReceiver, что есть входящий звонок? Реализую ли я в нем события?

Nostromo 12.10.2018 06:55

Вам необходимо зарегистрировать приемник в файле Android Manifest. Примерно так <Receiver android: name = ". PhoneStateReceiver"> <intent-filter> <action android: name = "android.intent.action.PHONE_STATE" /> </intent-filter> </receiver>

Ramesh Yankati 12.10.2018 09:36

Вам понадобится Broadcast Receiver примерно так.

        /**
         * 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
Ответ принят как подходящий

Наконец-то я на шаг впереди. Я создал класс 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 конкретного проекта Android с помощью следующих трех строк кода:

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

Теперь, когда я устанавливаю точки останова в case части switch (state) в OnCallStateChanged, они ломаются, но incomingNumber всегда пуст, хотя я установил соответствующие права в манифесте.

Итак, это будет мой следующий шаг, чтобы получить номер вызывающего абонента.

Другие вопросы по теме