android - Android 9+ 不提供来电号码
问题描述
在 Android 8.0 中,我收到传入的电话号码。我要求获得 READ_PHONE_STATE 权限,并且用户必须为该应用授予此权限。
然而,同样的事情在 Android 9.0 上不起作用(在多个设备上测试过)。
两个版本的代码相同。
我应该怎么做才能拥有这个?这是代码
package io.gvox.phonecalltrap;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;
import android.content.Context;
import android.Manifest;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import org.json.JSONException;
import org.json.JSONArray;
public class PhoneCallTrap extends CordovaPlugin {
CallStateListener listener;
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
prepareListener();
listener.setCallbackContext(callbackContext);
return true;
}
private void prepareListener() {
if (listener == null) {
listener = new CallStateListener();
TelephonyManager TelephonyMgr = (TelephonyManager) cordova.getActivity().getSystemService(Context.TELEPHONY_SERVICE);
TelephonyMgr.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
}
class CallStateListener extends PhoneStateListener {
private CallbackContext callbackContext;
public void setCallbackContext(CallbackContext callbackContext) {
this.callbackContext = callbackContext;
}
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (callbackContext == null) return;
String msg = "";
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
msg = "IDLE|" + incomingNumber;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
msg = "OFFHOOK|" + incomingNumber;
break;
case TelephonyManager.CALL_STATE_RINGING:
msg = "RINGING|" + incomingNumber;
break;
}
PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
result.setKeepCallback(true);
callbackContext.sendPluginResult(result);
}
}
注意:我实际上确实收到了通话状态(IDLE, OFFHOOK, RINGING...),但没有收到电话号码
解决方案
READ_CALL_LOG
除了您的应用用例所需的其他权限外,在 Android 9 上运行的应用必须先获得权限,才能读取电话号码或电话状态。与呼入和呼出相关的电话号码在电话状态广播中可见,例如呼入和呼出,并且可以从
PhoneStateListener
类中访问。但是,未经许可READ_CALL_LOG
,PHONE_STATE_CHANGED
广播和直通中提供的电话号码字段PhoneStateListener
为空。
它继续说明需要进行哪些更改:
要从电话状态读取电话号码,请更新您的应用以根据您的用例请求必要的权限:
- 要从
PHONE_STATE
意图操作中读取数字,您需要READ_CALL_LOG
权限和READ_PHONE_STATE
权限。- 要从中读取数字
onCallStateChanged()
,您只需要获得READ_CALL_LOG
许可。你不需要READ_PHONE_STATE
权限。
推荐阅读
- c - 为什么退出的子进程会导致父进程的 sigsuspend 调用在 macOS 上返回?
- ios - 其他国家的价格何时发生变化?
- javascript - 创建多维数组的Javascript函数
- django - 内联表单集只保存最后一个表单
- python-3.x - 如果包含图表,则无法使用 openpyxl 打开 excel
- html - how to make label appear below radio button
- python - 如何将字典转换为 vtk 文件以绘制 3D 网格
- r - 正则表达式提取三个字符
- python - 试图在python中拆分数组
- swift - 使用通用元素扩展数组