Je joue un fichier via le lecteur multimédia et je veux donner des options telles que haut-parleur, éteindre, jouer au casque, bluetooth, etc. J'ai essayé le code ci-dessous qui fonctionne bien pour Android 2.2, mais je veux quelque chose qui peut également fonctionner 2.2 et 4.0 les deux . Pouvez-vous m'aider à activer/désactiver par programmation le haut-parleur et la lecture au casque?
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);
P.S: J'ai donné cette permission dans le manifeste: permission Android.permission.MODIFY_AUDIO_SETTINGS
Quelque chose comme cela pourrait fonctionner sur certains appareils (je n'ai testé que sur un 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.
La combinaison FOR_MEDIA, FORCE_SPEAKER
est généralement utilisée en interne uniquement pour acheminer l'audio de la radio FM vers le haut-parleur (car la radio FM nécessite l'installation d'un casque/casque filaire pour servir d'antenne). Les périphériques qui ne disposent pas de la fonctionnalité radio FM (ou utilisent une autre implémentation) peuvent ignorer cette combinaison de paramètres. Cette méthode ne fonctionnerait donc pas sur un tel périphérique.
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();
}
}
});
Vous pouvez acquérir une enceinte arrière ou une oreillette avant à la fois.
Si aucun accessoire n'est connecté;
Utilisez audioManager.setMode(AudioManager.MODE_IN_CALL);
& audioManager.setSpeakerphoneOn(false);
pour utiliser le haut-parleur/l’écouteur avant. Mais cela ne jouerait audio dans l’écouteur pas sur le haut-parleur. Pour utiliser le haut-parleur arrière, utilisez audioManager.setMode(AudioManager.MODE_NORMAL);
& audioManager.setSpeakerphoneOn(true);
Si accessoire connecté; Utilisez audioManager.setMode (AudioManager.MODE_IN_CALL); & audioManager.setSpeakerphoneOn (false); utiliser haut-parleur/oreillette avant. Mais cela ne jouerait audio dans l’écouteur pas sur le haut-parleur. Pour utiliser le haut-parleur arrière, utilisez audioManager.setMode(AudioManager.MODE_IN_CALL);
& audioManager.setSpeakerphoneOn(true);
Remarque: assurez-vous que audioManager.setWiredHeadsetOn(boolean on)
et audioManager.setBluetoothScoOn(boolean on)
sont réglés surfalse
pour acheminer l'audio par le biais d'une oreillette. Et définissez soit surtrue
pour acheminer l'audio en conséquence.
si vous voulez juste ouvrir votre haut-parleur sur u, écrivez simplement cette ligne dans oncreate () de votre activité.
static AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
Problème résolu. Pour tous ceux qui cherchent encore la réponse. Eh bien ce n'est pas un bug, mais juste une chose délicate. Vous devez utiliser PhoneStateListener
En utilisant ce guide: http://danielthat.blogspot.co.il/2013/06/Android-make-phone-call-with-speaker-on.html
Essaye ça.
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);
essayez de suivre l'extrait de code:
//for spearphone on
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);
//for headphone on
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(false);
BTW, j'ai testé dans Android 7.0 (Redmi 4x) et cela a bien fonctionné.