Подтвердить что ты не робот

Обнаружение исходящего вызова и события зависания вызова в android

У меня есть требование, в котором я хочу обнаружить два типа событий, связанных с вызовами в Android

  • Всякий раз, когда выполняется исходящий вызов, мое приложение должно знать это вместе с вызываемым номером
  • Когда звонок повесился (из-за успеха/сбоя), мое приложение должно узнать об этом вместе с причиной зависания

Возможно ли это в Android?

4b9b3361

Ответ 1

Вам необходимо создать BroadcastReceiver:

public class CallReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                TelephonyManager.EXTRA_STATE_RINGING)) {

                // Phone number 
                String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

                // Ringing state
                // This code will execute when the phone has an incoming call
        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                TelephonyManager.EXTRA_STATE_IDLE)
                || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                        TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            // This code will execute when the call is answered or disconnected
        }

    }
}

Вы должны зарегистрировать свое приложение, чтобы прослушать эти намерения в манифесте:

<receiver android:name=".CallReciever" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
 </receiver>

Ответ 2

Существует более простое решение, использующее только TelephonyManager и PhoneStateListener. Вам даже не нужно регистрировать BroadcastReceiver.

public class MyPhoneStateListener extends PhoneStateListener {

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            //Hangup
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            //Outgoing
            case TelephonyManager.CALL_STATE_OFFHOOK:
                break;
            //Incoming
            case TelephonyManager.CALL_STATE_RINGING:
                break;
        }
    }
}

И зарегистрировать его:

public static void registerListener(Context context) {
    ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(new MyPhoneStateListener(),
            PhoneStateListener.LISTEN_CALL_STATE);
}