我一直在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。在Android版本〈=API 27中,一切正常
我还在清单文件中添加了READ_PHONE_STATE
和READ_CALL_LOG
权限。
有什么想法吗?还有谁遇到同样的问题吗?
2条答案
按热度按时间pobjuy321#
我找到了问题的答案:
首先,在
Android 9
中,您必须在运行时显式请求READ_PHONE_STATE
和READ_CALL_LOG
权限,而在以前的Android版本中,您只需请求READ_PHONE_STATE
权限,这两个权限都必须在运行时请求。其次,如果上述两个权限都已被赋予,则
onReceive
方法将被调用两次(!!)。第一次Intent为“empty”(EXTRA_INCOMING_NUMBER
为null)。第二次Intent将正常填充。这在TelephonyManager文档中有记录。hc8w905p2#
在manifest中添加
READ_CALL_LOG
权限,如下所示:然后
应用程序-〉您的应用程序-〉权限-〉授予呼叫日志权限
您现在应该获得电话号码,在第二次呼叫您的
receiver
之后