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

Ira*_*lis 3 android

我有一个BroadcastReceiver听取来电的人.当呼叫进入时,我通过执行以下操作获得号码:

Bundle extras = intent.getExtras();
...
String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Run Code Online (Sandbox Code Playgroud)

当来电来自保留号码,以及为phoneNumber字符串分配了什么值时会发生什么?

我猜它要么null,"unknown","withheld",或类似的东西,但不幸的是我还没有找到如何模拟从扣留号来电,所以我不能肯定.

Vik*_*ram 5

您可以阅读以下来源TelephonyRegistry:链接

/**...此类提供了一个应用程序可以注册并从中回拨的集中位置.*/

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

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);
}
Run Code Online (Sandbox Code Playgroud)

因此,您将收到与TelephonyManager.EXTRA_INCOMING_NUMBERiff incomingNumber不为空相对应的值.

incomingNumber来自DefaultPhoneNotifier#notifyPhoneState(Phone):链接

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER,
                              "Personalized message for a Blocked Call");
Run Code Online (Sandbox Code Playgroud)

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