【问题标题】:Phone state changed listener never fired电话状态改变的监听器从未被解雇
【发布时间】:2017-02-09 09:20:29
【问题描述】:

我正在尝试在服务中创建电话状态更改侦听器。我的服务扩展了基本服务,所以没有 IntentService 或类似的东西。

接收者是基本的BroadcastReceiver,我这样注册:

IntentFilter filter = new IntentFilter();
filter.addAction(TelephoneManager.ACTION_PHONE_STATE_CHANGED);
registerReceiver(receiver, filter);

但是我的接收器onReceive 从未被调用过。我错过了什么?例如,如果我将过滤器操作更改为Intent.ACTION_SCREEN_OFF,我每次关闭屏幕时都会收到onReceive,所以我认为我的IntentFilter 可能存在问题。我想用它来监听来电、信号强度、小区 ID 变化和所有这些东西。我已经在清单中注册了READ_PHONE_STATE 权限,所以这应该不是问题。我的设备是装有 Android 6.0.1 的 Nexus 5X

有什么想法吗?

【问题讨论】:

  • 您的 Gradle 文件中有哪些目标 SDK? 23岁或以上?
  • 目标为 25,最小为 23
  • 确保您已在清单文件中添加服务和广播接收器
  • 由于我在代码中注册了接收器,因此无需将其添加到清单中。正如我所说,我的接收器是完全正确的,因为当我将意图更改为 screen_off 时,我会收到事件。我没有通过 PHONE_STATE 操作获得 onReceive

标签: android broadcastreceiver phone-state-listener


【解决方案1】:

根据 Android 文档,当您尝试使用危险权限时,您需要请求访问它。在此处查看危险权限和正常权限之间的区别:Requesting Permissions - Normal and Dangerous Permissions

关于如何请求权限的信息:Requesting Permissions at Run Time

一个快速的解决方法是将您的目标 API 减少到 22(低于 23),但这应该是一个临时解决方案。

关于信号强度,注册ACTION_PHONE_STATE_CHANGED无法获取信息。来自Android documentation 的功能是:

指示设备上的呼叫状态已更改的广播意图操作。

因此,这仅适用于通话状态(振铃、挂断等),不适用于信号强度。这是有道理的,因为信号强度每秒会发生多次变化,而每秒如此大量的事件会很快耗尽电池电量。

也许一个选项将是一种两级方法:当您的应用程序处于前台时,从 Activity 内部使用 PhoneStateListener,在后台时每隔几秒使用一次 TelephonyManager.get*CellInfo()。另请参阅此问题:How to get cell service signal strength in Android?

【讨论】:

  • 这也不是问题,因为我已经通过检查应用管理器中的电话权限暂时解决了这个问题,如果我使用 PackageManager 测试它说 READ_PHONE_STATE 被授予
  • 您是否尝试在手动检查权限后强制停止您的应用并重新启动它以确保调用完成时权限已设置?
  • 是的,我已经做到了。正如我所说,我会在注册接收者之前检查权限状态,系统说它已被授予
  • 那么,也许你可以尝试使用PhoneStateListener developer.android.com/reference/android/telephony/… 这个答案可能会提供一些额外的帮助stackoverflow.com/questions/31949063/…
  • 好吧,我已经在活动中尝试过 PhoneStateListener 并且它可以工作,但问题是我希望它在服务内工作,这对于 PhoneStateListener 是不可能的,因为它没有被提及用于后台使用。这就是为什么我尝试使用简单的 BroadcastReceiver 但仍然不知道为什么它没有触发
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多