android - Android 9.0 中的 PhoneStateListener onCallStateChanged 方法参数“传入号码”为空?
问题描述
@Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_RINGING: if (incomingNumber == null || "".equals(incomingNumber)) { return; } break; } }
我在 Android sdk27 下遇到过同样的问题,我在 PhoneService 中启动 PhoneStateListener ,
public void startPhoneStateListener() { mTelManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); mTelManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); }
但我只在 RootReceiver 中启动服务,而不是在 MainActivity 中,当我在 MainActivity 中启动 PhoneService 时,我修复了它。
<receiver android:name=".receiver.RootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
但这仅适用于 Android sdk 27 以下,我不知道 Android 9.0 ,顺便说一下,我已经写了权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
解决方案
与呼入和呼出相关的电话号码在电话状态广播中可见,例如呼入和呼出,并且可以从
PhoneStateListener
类中访问。但是,未经许可READ_CALL_LOG
,PHONE_STATE_CHANGED
广播和直通中提供的电话号码字段PhoneStateListener
为空。
READ_CALL_LOG
如果您想要传入的电话号码,您必须请求许可。
请注意,根据同一页面:
要从中读取数字
onCallStateChanged()
,您只需要获得READ_CALL_LOG
许可。你不需要READ_PHONE_STATE
权限。
推荐阅读
- java - 选择特定工作区时,Eclipse 在后台运行
- r - 使用 r 在同一图表上绘制月度和年度数据
- spring - 春休服务。无效的块头
- linux - 如何指出是什么在线程转储文件中将线程置于 WAITING 状态
- html - html中的Allingment问题 - 需要在右上角获取记录
- laravel - 流明:从模型文件调用特征帮助文件不起作用
- mysql - 删除后更新 | mysql触发器
- c# - 高效返回 IList
来自列表 (避免从列表中投射 列出) - ios - 我将在哪里获得用于实现 Azure B2c 身份验证的 kGraphURI 和 kScopes
- powershell - 在格式化的 csv 中检索 SamAccountName 和关联的组