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"/>
我开发了一个收音机应用程序,我需要在 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"/>