在Android 9中获取来电显示

har*_*ris 13 android broadcastreceiver caller-id android-9.0-pie

我一直在使用以下代码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;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这已经停止了Android 9.0 (API 28).更具体地说, aIntent.getStringExtra(EXTRA_INCOMING_NUMBER)始终返回null.在android中versions<=API 27一切正常

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

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

在此先感谢您的帮助.

har*_*ris 18

我找到了问题的答案:

首先,在运行时Android 9,您必须明确要求READ_PHONE_STATEREAD_CALL_LOG权限.在之前的Android版本中,您只需要获得READ_PHONE_STATE许可即可.必须在运行时询问它们.

其次,如果已经给出了上述两个权限,则该onReceive方法被调用两次(!!).第一次意图是"空"(EXTRA_INCOMING_NUMBER为空).第二次意图正常填充应该.这在TelephonyManager文档中有记录.

  • 正如@haris所写,自2019年1月9日起,如果您的应用程序不是默认拨号程序应用程序,则无法请求READ_CALL_LOG.如果没有api 28及以上版本的许可,我如何获得来电显示? (3认同)
  • 抱歉,之前的评论尚未发布。我想提醒您注意新的Google政策,该政策将于2019年1月9日生效,该政策限制了对READ_CALL_LOG权限的使用(请参阅上一条评论中的链接)。 (2认同)