android - PhoneStateListener 在安卓 Lollipop 中不起作用

标签 android android-5.0-lollipop phone-state-listener

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

提前致谢。

                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 的类,并在 onreceive 方法内部检查电话状态,如下所示。

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

在此之后,在 list 文件中添加广播接收器。

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

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

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

关于android - PhoneStateListener 在安卓 Lollipop 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28279093/

相关文章:

android - 在android中的拨号器上显示图片

android - 如何拦截点击TextView中的链接?

android - 带有 ImageButton 的垂直 LinearLayout : Problems with different screens

android - 当min sdk为5.0以下时,启用multidex创建singledex,而当min sdk为5.0以上时,则启用multidex。

android - 在Android中检索来电的电话号码

android - 如何跟踪最后一次通话时长?

android - 错误 : Only the original thread that created a view hierarchy can touch its views in Xamarin

android - 当 TabHost 出现在 Activity 中时,EditText 使用硬键盘失去焦点

Android 托管配置文件 - 配置文件所有者无法设置用户限制 no_add_user

android - 无法使用 ANDROID PREVIEW SYSTEM IMAGE 刷入 Nexus 7[2012][Wifi]