I use descendant - class of PhoneStateListener:
class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
if (incomingNumber!=null)
{
// code for incoming call handling
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
这是我的广播接收器:
class ServiceReceiver extends BroadcastReceiver {
CallStateListener phoneListener;
@Override
public void onReceive(final Context context, Intent intent) {
if (phoneListener == null) {
phoneListener = CallStateListener.getCallStateInstance(context);
TelephonyManagerSingletone.getInstance().getTelephonyManager().listen(CallStateListener.getCallStateInstance(context),
android.telephony.PhoneStateListener.LISTEN_CALL_STATE);
}
}
清单:
<receiver android:name="com.library.ServiceReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
但是当我像这样使用它时,我在 CallStateListener 中收到重复的调用。我该如何解决这个问题?
当我尝试您的代码时,它运行了 10 次,而不是只运行一次!在这种情况下,最好将phoneListener
声明为静态变量。这样,您可以保证listen
方法不会被多次调用。看看这个:
public class ServiceReceiver extends BroadcastReceiver {
static CallStateListener phoneListener;
@Override
public void onReceive(final Context context, Intent intent) {
if (phoneListener == null) {
phoneListener = new CallStateListener();
TelephonyManager tm = (TelephonyManager)context.getSystemService("phone");
tm.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
}
另外,我已经改变了你处理TelephonyManager
的方式 - 我找不到你在代码中提到的TelephonyManagerSingletone
。
我希望这对某人有所帮助!
不确定这是错误还是功能,但自从 API19 以来,广播就会发生这种情况。
对于那些将搜索解决方案的人 - 您可以跟踪以前的状态。只有当它不同时,才做事情。
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
如果您添加这些权限,那么您的广播接收器会收到两次。
https://developer.android.com/reference/android/telephony/TelephonyManagerACTION_PHONE_STATE_CHANGED
公共静态最终字符串ACTION_PHONE_STATE_CHANGED广播意图操作,指示设备上的调用状态已更改。
EXTRA_STATE extra 指示新的呼叫状态。如果接收应用具有 Manifest.permission。READ_CALL_LOG权限,第二个额外EXTRA_INCOMING_NUMBER以字符串形式提供传入和传出呼叫的电话号码。
如果接收应用具有Manifest.permission.READ_CALL_LOG和Manifest.permission.READ_PHONE_STATE权限,它将接收两次广播;一次EXTRA_INCOMING_NUMBER填充了电话号码,另一次为空白。由于广播的性质,您无法假设这些广播到达的顺序,但是在这种情况下,您可以保证收到两个。对EXTRA_INCOMING_NUMBER感兴趣的应用可以忽略附加内容中不存在EXTRA_INCOMING_NUMBER的广播(例如,Intent#hasExtra(String) 返回 false)。您可以使用一个条件,此问题已解决
if (!intent.hasExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)){
//Do your work or code in this section
}