Как включить или выключить динамик в android 4.0
Я воспроизводю файл через медиаплеер и хочу включить/выключить динамик, играть через гарнитуру, Bluetooth и т.д. Я попробовал приведенный ниже код, который хорошо работает для Android 2.2, но я хочу что-то, что также может работать для 2.2 и 4.0. Можете ли вы помочь мне программно включить/выключить динамик и играть через наушники?
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if(isOn){
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setMode(AudioManager.MODE_NORMAL);
}else{
//Seems that this back and forth somehow resets the audio channel
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setMode(AudioManager.MODE_IN_CALL);
}
audioManager.setSpeakerphoneOn(isOn);
PS: я дал это разрешение в манифесте:
android.permission.MODIFY_AUDIO_SETTINGS
Ответы
Ответ 1
Что-то вроде этого может работать на некоторых устройствах (я тестировал только XPEA P):
final static int FOR_MEDIA = 1;
final static int FORCE_NONE = 0;
final static int FORCE_SPEAKER = 1;
Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
// To get back to the default behaviour, use the combination FOR_MEDIA,FORCE_NONE.
Комбинация FOR_MEDIA, FORCE_SPEAKER
обычно используется только внутренне для направления FM-радиосигнала на громкоговоритель (поскольку для FM-радио требуется, чтобы проводная гарнитура/наушники были подключены, чтобы действовать как антенна). Устройства, которые не имеют функциональности FM-радио (или используют альтернативную реализацию), могут игнорировать эту комбинацию параметров, поэтому этот метод не будет работать на таком устройстве.
Ответ 2
AudioManager mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
Button mVolumeButton = (Button)findViewById(R.id.btn_Volume);
mVolumeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mAudioMgr.isWiredHeadsetOn()){
mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mAudioMgr.setWiredHeadsetOn(false);
mAudioMgr.setSpeakerphoneOn(true);
mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
Toast.makeText(getApplicationContext(), "SpeakerPhone On", Toast.LENGTH_LONG).show();
}else{
mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioMgr.setSpeakerphoneOn(false);
mAudioMgr.setWiredHeadsetOn(true);
Toast.makeText(getApplicationContext(), "Wired Headset On", Toast.LENGTH_LONG).show();
}
}
});
Ответ 3
Вы можете приобрести либо задний динамик, либо фронтальный динамик в момент времени.
Если аксессуар не подключен,
Используйте audioManager.setMode(AudioManager.MODE_IN_CALL);
и audioManager.setSpeakerphoneOn(false);
для использования фронтальной колонки/динамика. Но это будет звучать в динамике не на динамике. Чтобы использовать задний динамик, используйте audioManager.setMode(AudioManager.MODE_NORMAL);
и audioManager.setSpeakerphoneOn(true);
Если подключен аксессуар; Использовать audioManager.setMode(AudioManager.MODE_IN_CALL); и audioManager.setSpeakerphoneOn(false); для использования фронтального динамика/динамика. Но это будет звучать в динамике не на динамике. Чтобы использовать задний динамик, используйте audioManager.setMode(AudioManager.MODE_IN_CALL);
и audioManager.setSpeakerphoneOn(true);
Примечание. Убедитесь, что audioManager.setWiredHeadsetOn(boolean on)
и audioManager.setBluetoothScoOn(boolean on)
установлены на false
для маршрутизации аудио через наушники. И установите для параметра true
значение .
Ответ 4
Проблема решена. Для всех вас, которые все еще ищут ответ. Ну, это не ошибка, а просто сложная штука. Вам нужно использовать PhoneStateListener
Используя это руководство: http://danielthat.blogspot.co.il/2013/06/android-make-phone-call-with-speaker-on.html
Ответ 5
Если вы просто хотите открыть свой громкоговоритель, и просто напишите эту строку в oncreate() своей деятельности.
static AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
Ответ 6
Попробуй это.
AudioManager audioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (isOn) {
isOn = false;
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setMode(AudioManager.MODE_NORMAL);
} else {
isOn = true;
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setMode(AudioManager.MODE_IN_CALL);
}
audioManager.setSpeakerphoneOn(isOn);
Ответ 7
попробуйте выполнить фрагмент кода:
//for spearphone on
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);
//for headphone on
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(false);
Кстати, я тестировал в Android 7.0 (Redmi 4x), и он работал нормально.
Ответ 8
Попробуйте
AudioManager.speakerphone(true);
Посмотрите это.