【问题标题】:How to get the incoming call phone number?如何获取来电电话号码?
【发布时间】:2023-12-19 23:43:01
【问题描述】:

我想在 android 中获取传入的电话号码。我尝试过使用 BroadcastListener,我的 Broadcastlistener 看起来像这样..

    public class InterceptCall extends BroadcastReceiver {
            public int cnt = 0;
public int cnt2 = 0;
TelephonyManager telephony;
@Override
public void onReceive(final Context context, final Intent intent) {

    if(telephony != null)return;
    telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            String state1 = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            if (state1.equals(TelephonyManager.EXTRA_STATE_RINGING) && state == 1) {
                Toast.makeText(context, "Ringing - " + cnt, Toast.LENGTH_SHORT).show();
                cnt++;
                System.out.println("incomingNumber : " + cnt + " " + incomingNumber);

            }

        }
    }, PhoneStateListener.LISTEN_CALL_STATE);

}

    }

这提供了正确的号码,但问题是当任何新呼叫响铃时,以前的号码总是显示在 toast 中。例如,如果三个电话接连打来,第三次会有 3 条 toast 消息。我该如何解决这个问题?

【问题讨论】:

    标签: android broadcastreceiver telephonymanager


    【解决方案1】:

    我认为您正在混合使用两种不同的方法来获取呼叫状态更改的更新:BroadcastReceiverPhoneStateListener

    您应该使用第一个或第二个。 通过同时使用这两者,您实际上会为同一事件注册越来越多的侦听器,因此您在 3 次调用后最终会使用 3 个基本上做相同事情的侦听器。

    如果您想通过PhoneStateListener 使用侦听器方法,只需在您的应用启动时注册您的侦听器并处理一次传入事件。

    从您的清单中删除广播接收器注册代码。

    【讨论】: