web-dev-qa-db-fra.com

comment activer/désactiver le haut-parleur par programme dans Android 4.0

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 

18
mayuri

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.

26
Michael
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();
                }
            }
        });
4
Jatin Patel

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 surfalsepour acheminer l'audio par le biais d'une oreillette. Et définissez soit surtruepour acheminer l'audio en conséquence.

3
Jayesh Tembhekar

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);
2
Sujith Ks

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

2
myna

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);
1
user9673947

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é.

0
Aolphn