Как включить / выключить динамик программно в 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 разрешение
8 ответов
Нечто подобное может работать на некоторых устройствах (я тестировал только на XPeria 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-радио (или используют альтернативную реализацию), могут игнорировать эту комбинацию параметров, поэтому этот метод не будет работать на таком устройстве.
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();
}
}
});
Вы можете приобрести задний динамик или передний динамик одновременно.
Если аксессуар не подключен;
использование 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
направить аудио соответственно.
Попробуйте следовать фрагменту кода:
//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), и он работал нормально.
Попробуй это.
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);
Задача решена. Для всех вас, кто все еще ищет ответ. Ну, это не ошибка, а просто хитрость. Вам нужно использовать PhoneStateListener
Используя это руководство: http://danielthat.blogspot.co.il/2013/06/android-make-phone-call-with-speaker-on.html
Если вы просто хотите включить громкую связь, просто напишите эту строку в oncreate() вашей деятельности.
static AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);