PhoneStateListener 在 android lollipop 中不工作

PhoneStateListener is not working in android lollipop

我开发了一个收音机应用程序,我需要在 incoming/outgoing phone 来电时暂停收音机。我使用了 PhoneStateListener,它在所有 android 版本中都运行良好,但在 lollipop 中除外。这是我用来处理 phone 调用的代码。我已经尝试了 setStreamVolume 和 setStreamMute 方法,但两者似乎都不适用于棒棒糖。请一些人帮助我。

提前致谢。

                PhoneStateListener phoneStateListener = new PhoneStateListener() {
                @Override
                public void onCallStateChanged(int state,
                        String incomingNumber) {
                    switch (state) {

                    case TelephonyManager.CALL_STATE_RINGING: // Incoming
                                                                // call:
                                                                // Pause
                                                                // music
                        if (Globals.isPlayerRunning) {
                            curVolume = audioManager
                                    .getStreamVolume(AudioManager.STREAM_MUSIC);
                            audioManager.setStreamVolume(
                                    AudioManager.STREAM_MUSIC, 0, 0);
                            audioManager.setStreamMute(
                                    AudioManager.STREAM_MUSIC, true);
                            isServiceMuteByCall = true;
                        }
                        break;

                    case TelephonyManager.CALL_STATE_IDLE: // Not in
                                                            // call:
                                                            // Play
                                                            // music
                        if (isServiceMuteByCall) {
                            isServiceMuteByCall = false;
                            audioManager.setStreamMute(
                                    AudioManager.STREAM_MUSIC, false);
                            audioManager.setStreamVolume(
                                    AudioManager.STREAM_MUSIC, curVolume,
                                    AudioManager.FLAG_PLAY_SOUND);
                        }
                        break;

                    case TelephonyManager.CALL_STATE_OFFHOOK:// A call
                                                                // is
                                                                // dialing,
                                                                // active
                                                                // or
                                                                // on
                                                                // hold
                        if (Globals.isPlayerRunning) {
                            curVolume = audioManager
                                    .getStreamVolume(AudioManager.STREAM_MUSIC);
                            audioManager.setStreamMute(
                                    AudioManager.STREAM_MUSIC, true);
                            audioManager.setStreamVolume(
                                    AudioManager.STREAM_MUSIC, 0, 0);
                            isServiceMuteByCall = true;
                        }
                        break;
                    }
                    super.onCallStateChanged(state, incomingNumber);

                }
            };

            if (mgr != null) {
                mgr.listen(phoneStateListener,
                        PhoneStateListener.LISTEN_CALL_STATE);
            }

这是上述问题的解决方案。这可以使用 BroadcastReceiver 来解决。

创建一个扩展 BroadcastReceiver 的 class 并在 onreceive 方法内部检查 phone 状态,如下所示。

public class TelephonyManagerReceiver extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {

         if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(intent.getAction())) {

             String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

             if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
                 //stop the player or mute the audio here
             } else if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
                 //start the player or unmute the audio here
             } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {
                 //stop the player or mute the audio here
             }
        }   
    }   
}

在此之后在清单文件中添加广播接收器。

<receiver android:name="com.radioapp.util.TelephonyManagerReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
 </receiver>

并确保您在清单中请求此权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>