2

我使用后代 - 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 中收到了重复的呼叫。我怎样才能解决这个问题?

4

2 回答 2

3

当我尝试您的代码时,它运行了 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你在代码中提到的那个。

我希望这对某人有帮助!

于 2013-11-25T10:48:20.033 回答
0

不确定这是错误还是功能,但由于 API19 发生在广播中。

对于那些将寻找解决方案的人 - 您可以跟踪以前的状态。只做不同的事情。

于 2016-01-23T12:28:44.860 回答