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方法时将speackphoneon设置为true,它仍然无法可靠地打开免提电话。音量也不可靠,似乎无法在没有崩溃的情况下将其设置为最大值。
答案 0 :(得分:0)
以下是执行此操作的代码。我在运行棒棒糖的手机上测试过。将PhoneStateListener写为:
private class myPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK: //Call is established
Log.d("s@urav", "Call is Offhook now!");
try {
Thread.sleep(500); //We never know when the call is actually OffHook
} catch (InterruptedException e) {
Log.d("s@urav","Exception is:"+e);
}
audioManager.setSpeakerphoneOn(true);
break;
case TelephonyManager.CALL_STATE_IDLE: //Call is finished
//Maintain a flag and do this only if speakerphone has been set on OFFHOOK
/*audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(false);*/
break;
}
}
}
要提高通话音量,您必须增加STREAM_VOICE_CALL的音量。此代码+增加呼叫流量将满足您的要求。