【发布时间】:2013-11-24 17:46:30
【问题描述】:
AudioManager 在 onCallStateChanged 中不可靠。在通话期间,我需要它打开免提电话并将音量设置为最大。它有时会打开免提电话(通常在第二次或以后的通话中)并且很少调高音量。我的 PhoneCallListener 类在我的 MainActivity 类中。
private class PhoneCallListener extends PhoneStateListener
{
private boolean isPhoneCalling = false;
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
AudioManager aM = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
aM.setMode(AudioManager.MODE_IN_CALL);
aM.setSpeakerphoneOn(true);
if(TelephonyManager.CALL_STATE_RINGING == state)
{
//phone ringing
aM.setSpeakerphoneOn(true);
aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
}
if(TelephonyManager.CALL_STATE_OFFHOOK == state)
{
//phone active
aM.setSpeakerphoneOn(true);
aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
isPhoneCalling = true;
}
if(TelephonyManager.CALL_STATE_IDLE == state)
{
aM.setSpeakerphoneOn(false);
if(isPhoneCalling)
{
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
isPhoneCalling = false;
}
}
}
}
在 CALL_STATE_OFFHOOK 中,我不得不关闭 AudioManager.FLAG_SHOW_UI,因为它会持续显示音量 UI。此外,设置 aM.setStreamVolume(AudioManager.STREAM_MUSIC, aM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);由于某种原因使应用程序崩溃。
关于如何让 AudioManager 每次都能正常工作,以便在通话期间打开免提电话并达到最大音量有什么建议吗?
编辑:即使在调用 onCallStateChanged 方法后将扬声器设置为 true,它仍然不能可靠地打开扬声器。音量也不可靠,似乎无法将其设置为最大而不崩溃。
【问题讨论】:
-
您是否注意到手机在接听电话时会自动关闭免提?因此,如果你们都尝试同时打开和关闭它,它只会偶尔打开也就不足为奇了。
-
此代码用于手机拨打电话时使用,而不是接听电话。拨打电话时,我希望免提电话处于开启状态。
-
同样的区别 - 如果手机本身关闭它,关键是你应该在收到回电后尝试等待 1 秒再打开它,这样它就不会被覆盖回通过电话“关闭”。
标签: android volume android-audiomanager speakerphone