17

我一直在使用以下代码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中versions<=API 27一切正常

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

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

在此先感谢您的帮助。

4

2 回答 2

26

我找到了我的问题的答案:

首先,在 中Android 9,您必须在运行时显式请求 theREAD_PHONE_STATEREAD_CALL_LOG权限。在以前的 Android 版本中,您只需请求READ_PHONE_STATE许可。他们都必须在运行时被询问。

其次,如果上述两个权限都已授予,则该onReceive方法被调用两次(!!)。第一次意图是“空的”(EXTRA_INCOMING_NUMBER为空)。第二次通常按应有的方式填充意图。这记录在TelephonyManager 文档中。

于 2018-08-26T09:42:30.530 回答
4

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

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

然后

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

您现在应该得到电话号码,在您第二次被叫到receiver之后

于 2019-06-17T11:58:36.443 回答