在Android 9中获取来电显示

时间:2018-08-24 18:21:38

标签: android broadcastreceiver android-9.0-pie caller-id

我一直在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权限。

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

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

我找到了问题的答案:

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

第二,如果同时具有以上两个权限,则onReceive方法将被调用两次(!!)。意图首次为“空”(EXTRA_INCOMING_NUMBER为空)。通常第二次按预期填充意图。 TelephonyManager Documentation中对此进行了记录。

答案 1 :(得分:1)

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

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

然后

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

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