电话状态改变了听众永远不会被解雇

时间:2017-02-09 09:20:29

标签: android broadcastreceiver phone-state-listener

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

Receiver是基本的if (this.props.wells.length === 0) { return null } return ( <div id="map" ref="map"> {this.renderMarkers()} </div> ) ,我这样注册:

BroadcastReceiver

但我的接收器IntentFilter filter = new IntentFilter(); filter.addAction(TelephoneManager.ACTION_PHONE_STATE_CHANGED); registerReceiver(receiver, filter); 从未被调用过。我错过了什么?例如,如果我将过滤器操作更改为onReceive,则每次关闭屏幕时都会收到Intent.ACTION_SCREEN_OFF,因此我认为onReceive可能存在一些问题。我想用它来监听来电,信号强度,小区ID变化和所有这些。我在清单中注册了IntentFilter权限,所以这应该不是问题。我的设备是带有Android 6.0.1的Nexus 5X

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

从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?