2014-12-20 2 views
3

Я пытаюсь включить громкоговоритель во время звонка. Я пробовал этот код. Зарегистрируйте новый прослушиватель. Но это не работает. Он показывает сообщение тоста, но динамик по-прежнему не работает (по умолчанию используется только динамик).Как включить громкоговоритель во время разговора

@Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 
     switch (state) { 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       Log.i(LOG_TAG, "onCallStateChanged: CALL_STATE_OFFHOOK"); 
       try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       Toast.makeText(mContext,"Call, time to turn speaker on",Toast.LENGTH_SHORT).show(); 
       AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
       audioManager.setSpeakerphoneOn(true); 
       break; 
     } 
    } 

Конечно, я добавил разрешения в свой AndroidManifest.xml.

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

EDIT

Это так же не работает. Он возвращает false (сообщение Toast false);

case TelephonyManager.CALL_STATE_OFFHOOK: 
       Log.i(LOG_TAG, "onCallStateChanged: CALL_STATE_OFFHOOK"); 
       try { 

        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

        Toast.makeText(mContext,"Call, time to turn speaker on",Toast.LENGTH_SHORT).show(); 
       audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
       ((Activity)mContext).setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); 
       audioManager.setMode(AudioManager.MODE_IN_CALL); 
       audioManager.setSpeakerphoneOn(true); 
       boolean check = audioManager.isSpeakerphoneOn(); 
       Toast.makeText(mContext, "Speaker is on :" +String.valueOf(check),Toast.LENGTH_SHORT).show(); 
       break; 
+0

Попробуйте установить режим с помощью этого: audioManager.setMode (AudioManager.MODE_IN_CALL); – Amy

ответ

3

У меня была та же проблема, из-за пользовательских ПЗУ. Я установил складское ПО и все отлично работает, вот мой код

audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
       audioManager.setMode(AudioManager.MODE_IN_CALL); 
       if (!audioManager.isSpeakerphoneOn()) 
        audioManager.setSpeakerphoneOn(true); 
       audioManager.setMode(AudioManager.MODE_NORMAL); 
+0

Да, это действительно была проблема, я протестировал это на другом телефоне, и это работает. Thx – bzzxeqbmeotb

+0

Отсутствие последней строки сводило меня с ума. Благодарю. –

0

Пожалуйста, попробуйте в вашем CALL_STATE_OFFHOOK

setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); 
audioManager.setMode(AudioManager.MODE_IN_CALL);     
audioManager.setSpeakerphoneOn(true); 
audioManager.setMode(AudioManager.MODE_NORMAL);     
boolean check = am.isSpeakerphoneOn();//Toast it or Log it 
+0

Это не работает, громкоговоритель boolean является ложным. – bzzxeqbmeotb

+0

mayb некоторый родной подход должен достигнуть.let me попробуйте также – jenuine

+0

Класс audioSystemClass = Class.forName ("android.media.AudioSystem"); Метод setForceUse = audioSystemClass.getMethod ("setForceUse", int.class, int.class); // Первый 1 == FOR_MEDIA, второй 1 == FORCE_SPEAKER. Чтобы вернуться к поведению //, используйте FORCE_NONE (0). setForceUse.invoke (null, 1, 1); в этом http://stackoverflow.com/questions/12036221/ – jenuine