在Android 9中获取来电显示

6ojccjat  于 2023-04-10  发布在  Android
关注(0)|答案(2)|浏览(175)

我一直在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_STATEREAD_CALL_LOG权限。
有什么想法吗?还有谁遇到同样的问题吗?

pobjuy32

pobjuy321#

我找到了问题的答案:
首先,在Android 9中,您必须在运行时显式请求READ_PHONE_STATEREAD_CALL_LOG权限,而在以前的Android版本中,您只需请求READ_PHONE_STATE权限,这两个权限都必须在运行时请求。
其次,如果上述两个权限都已被赋予,则onReceive方法将被调用两次(!!)。第一次Intent为“empty”(EXTRA_INCOMING_NUMBER为null)。第二次Intent将正常填充。这在TelephonyManager文档中有记录。

hc8w905p

hc8w905p2#

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

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

然后
应用程序-〉您的应用程序-〉权限-〉授予呼叫日志权限
您现在应该获得电话号码,在第二次呼叫您的receiver之后

相关问题