我有一个BroadcastReceiver
来监听来电。当来电时,我通过执行以下操作获得号码:
Bundle extras = intent.getExtras();
...
String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
当来电来自保留号码时会发生什么,分配给phoneNumber字符串的值是什么?
我猜它是null
,"unknown"
,"withheld"
或类似的东西,但不幸的是我还没有找到如何模拟来自版主号码的来电,所以我不能确定。
答案 0 :(得分:5)
您可以阅读TelephonyRegistry
:Link
/ ** ...这个班提供了一个 应用程序可以注册并被回调的集中位置 从。 * /
来电的广播是通过以下方法发送的:
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。