TelephonyManager.CALL_STATE_RINGING呼叫两次,而一个呼叫响铃



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_LOGManifest.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
}

最新更新