在安卓 9 中获取来电显示



我一直在BroadcastReceiver使用以下代码来获取 来电的来电显示:

@Override
public void onReceive(Context aContext, Intent aIntent) {
String action = aIntent.getAction();
if (action==null) return;
if (!action.equals("android.intent.action.PHONE_STATE")) return;
String curState = aIntent.getStringExtra(TelephonyManager.EXTRA_STATE);
if ((TelephonyManager.EXTRA_STATE_RINGING.equals(curState))
&&(TelephonyManager.EXTRA_STATE_IDLE.equals(oldState)))){
String incNumber = aIntent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
// do something here
}
oldState=curState;
}

不幸的是,这在Android 9.0(API 28(中已经停止工作。更具体地说,aIntent.getStringExtra(EXTRA_INCOMING_NUMBER)始终返回 null。在安卓版本中<=API 27,一切正常

我还在清单文件中添加了READ_PHONE_STATEREAD_CALL_LOG权限。

有什么想法吗?还有其他人遇到同样的问题吗?

我找到了问题的答案:

首先,在Android 9中,您必须在运行时显式请求READ_PHONE_STATEREAD_CALL_LOG权限。在以前的Android版本中,您只需要请求READ_PHONE_STATE权限即可。两者都必须在运行时询问。

其次,如果同时授予了上述两个权限,则调用onReceive方法两次 (!!(。第一次意图为"空"(EXTRA_INCOMING_NUMBER为空(。第二次通常按预期填充意向。这记录在电话管理器文档中。

在清单中添加READ_CALL_LOG权限,如下所示:

<uses-permission android:name="android.permission.READ_CALL_LOG" />

然后

应用程序 ->您的应用程序 ->权限 ->授予通话记录权限

在第二次拨打receiver后,您现在应该获得电话号码

最新更新