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

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

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

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

3 ответов


вы должны создать 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>

существует более простое решение, использующее только 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);
}

вам нужно создать приемник для следующих действий намерения:

  1. исходящий вызов - ACTION_NEW_OUTGOING_CALL
  2. вызов hangup -ACTION_PHONE_STATE_CHANGED