如何获得来电电话号码?

时间:2019-12-01 08:41:30

标签: android broadcastreceiver telephonymanager

我想在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);

}

    }

这可以正确提供号码,但问题是当任何新呼叫都响起时,总是显示在吐司中的先前号码。例如,如果三个呼叫接连出现,则第三次将有3个Toast消息。我该如何解决?

1 个答案:

答案 0 :(得分:0)

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

您应该使用第一个或第二个。 通过同时使用两者,您实际上会继续为同一事件注册越来越多的侦听器,因此您在经过3次呼叫后最终与3个侦听器进行了基本相同的操作。

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

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