web-dev-qa-db-ja.com

androidでの発信コールとコールハングアップイベントの検出

Androidの通話に関連する2種類のイベントを検出したいという要件があります

  1. 発信コールが行われるときはいつでも、私のアプリケーションは着信番号とともにこれを知る必要があります
  2. 呼び出しが(成功/失敗により)ハングアップすると、アプリケーションは、ハングアップの理由とともにこれを知る必要があります。

これはAndroidで可能ですか?

32
user669231

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>
29
vendor

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);
}
7

次のインテントアクションのレシーバーを作成する必要があります。

  1. 発信コール- ACTION_NEW_OUTGOING_CALL
  2. 通話の終了- ACTION_PHONE_STATE_CHANGED
4
Nic Strong