AudioManager ненадежен
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, потому что он постоянно отображал пользовательский интерфейс громкости. Кроме того, установка aM.setStreamVolume(AudioManager.STREAM_MUSIC, aM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); вылетает приложение по какой-то причине.
Любые предложения о том, как заставить AudioManager работать каждый раз, чтобы громкая связь была включена и громкость была максимальной во время телефонного звонка?
Редактировать: Даже если для speackphoneon задано значение true, как только вызывается метод onCallStateChanged, он по-прежнему ненадежно включает громкую связь. Громкость также ненадежна и, кажется, не может установить его на максимум без его сбоя.
1 ответ
Ниже приведен код для этого. Я проверил в телефоне работает леденец. Напишите ваш 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. Этот код + увеличение объема потока вызовов будет соответствовать вашим требованиям.