在android中检测拨出呼叫和呼叫挂断事件

use*_*231 32 android state phone-call

我有一个要求,我想要检测与Android中的呼叫相关的两种事件

  1. 每当拨打电话时,我的应用程序都应该知道这个以及被叫号码
  2. 当呼叫被挂起时(由于成功/失败),我的应用程序应该知道这一点以及挂断的原因

这在Android中可行吗?

小智 29

你应该创建一个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
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

您应该注册您的应用程序以在清单中收听这些意图:

<receiver android:name=".CallReciever" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
 </receiver>
Run Code Online (Sandbox Code Playgroud)


Mar*_*ies 7

有一个更简单的解决方案,只使用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并注册:

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