在安卓系统中检测呼出电话和通话挂断事件

35

我有一个需求,需要检测与Android通话相关的两种事件:

  1. 每当发生呼出电话时,我的应用程序应该知道这一点,并且要知道拨打的号码
  2. 当通话因成功/失败而挂断时,我的应用程序应该知道这一点,并且要知道挂断的原因

这在Android中是否可行?

3个回答

34

你应该创建一个广播接收器:

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>

感谢提供示例代码。是否有一种类似于捕获来电的方式,可以捕获去电呢? - user669231
@user669231 是的,你应该改变if语句中的检查。你可以参考这个主题:https://dev59.com/7E3Sa4cB1Zd3GeqPt0U4 - vendor
1
运行得非常好。此外,您必须在manifest.xml文件中声明以下权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 否则,这将无法正常工作。请参阅TelephonyManager类的API:http://developer.android.com/reference/android/telephony/TelephonyManager.html - qupera
1
代码在 else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)) { } 块中执行了两次。在这个块中,我正在获取呼出电话的详细信息。请建议为什么会发生这种情况? - Ashish Tiwari
1
上面评论中描述的同样问题也发生在我身上了。有人能帮助我们解决多次获取相同电话状态的问题吗? - ARUNBALAN NV
但仍然无法检测到接收方已接收到呼叫。 - Dhanraj

9

有一个更简单的解决方案,只使用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
我使用了这个,但问题在于onCallStateChanged回调没有触发。 - Umesh Saraswat

4

你能给我一个例子吗?我需要进行外拨电话。 - Ashish Dwivedi
上述描述的解决方案对我来说完美地解决了问题。但是接收器多次接收到相同的状态。我们该如何解决这个问题?有没有办法检测接收意图的ID或其他方法? - ARUNBALAN NV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接