当呼叫被隐瞒/未知时,来电号码是什么?

时间:2014-02-05 13:24:30

标签: android

我有一个BroadcastReceiver来监听来电。当来电时,我通过执行以下操作获得号码:

Bundle extras = intent.getExtras();
...
String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);

当来电来自保留号码时会发生什么,分配给phoneNumber字符串的值是什么?

我猜它是null"unknown""withheld"或类似的东西,但不幸的是我还没有找到如何模拟来自版主号码的来电,所以我不能确定。

1 个答案:

答案 0 :(得分:5)

您可以阅读TelephonyRegistryLink

的来源
  

/ ** ...这个班提供了一个   应用程序可以注册并被回调的集中位置   从。 * /

来电的广播是通过以下方法发送的:

private void broadcastCallStateChanged(int state, String incomingNumber) {
    ....
    ....
    Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    intent.putExtra(PhoneConstants.STATE_KEY,
            DefaultPhoneNotifier.convertCallState(state).toString());

    // If `incomingNumber` is empty, the key 
    // `TelephonyManager.EXTRA_INCOMING_NUMBER` will not be present
    // in the attached Bundle
    if (!TextUtils.isEmpty(incomingNumber)) {
        intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber);
    }
    mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
            android.Manifest.permission.READ_PHONE_STATE);
}

因此,如果TelephonyManager.EXTRA_INCOMING_NUMBER不为空,您将收到与incomingNumber相对应的值。

incomingNumber来自DefaultPhoneNotifier#notifyPhoneState(Phone)Link

@Override
public void notifyPhoneState(Phone sender) {
    Call ringingCall = sender.getRingingCall();
    String incomingNumber = "";
    if (ringingCall != null && ringingCall.getEarliestConnection() != null){

        // Here
        incomingNumber = ringingCall.getEarliestConnection().getAddress();

    }
    try {
        mRegistry.notifyCallState(convertCallState(sender.getState()), incomingNumber);
    } catch (RemoteException ex) {
        // system process is dead
    }
}

ringingCall.getEarliestConnection().getAddress()从扩展getAddress()(GsmConnection,CdmaConnection ..)的类之一调用com.android.internal.telephony.Connection方法。

如果查看GsmConnection的构造函数,可以看到为数字和调用者名称分配了变量。据我所知,作为接收者,你只收到号码 - 如果有的话。因此,如果是空字符串(当阻止/隐藏来电者ID时),您收到的TelephonyManager.EXTRA_INCOMING_NUMBER中的密钥Bundle将不会出现。

您没有提到为什么需要此信息。如果您尝试通过比较字符串值来显示个性化消息,我建议您执行以下操作:

String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER,
                              "Personalized message for a Blocked Call");

我不确定这是否是一个充分的测试,但为了模拟被阻止的来电显示,你可以看一下这个问题:Link