web-dev-qa-db-fra.com

Comment détecter lorsqu'un utilisateur branche un casque sur Android appareil? (Opposé à ACTION_AUDIO_BECOMING_NOISY)

Je développe une application qui a la condition suivante: s'il y a un casque branché sur l'appareil et que l'utilisateur le supprime, je dois couper tous les flux. Pour ce faire, je dois écouter la diffusion AudioManager.ACTION_AUDIO_BECOMING_NOISY. C'est acceptable! Pas de problème ici.

Mais lorsque l'utilisateur rebranche le casque, je dois réactiver l'appareil. Mais il n'y a pas de AudioManager.ACTION_AUDIO_BECOMING_NOISY Émission contraire. Je ne peux pas savoir quand le casque est à nouveau branché.

Une solution consiste à voir périodiquement si AudioManager.isWiredHeadsetOn() est true mais cela ne semble pas être une bonne solution pour moi.

Existe-t-il un moyen de détecter lorsque l'utilisateur branche un casque sur l'appareil?

Modifié: J'ai essayé d'utiliser Intent.ACTION_HEADSET_PLUG De cette façon, mais cela n'a pas fonctionné.

Dans le manifest.xml je mets:

<receiver Android:name=".MusicIntentReceiver" >
    <intent-filter>
        <action Android:name="Android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>

Et voici le code de mon MusicIntentReceiver.Java:

public class MusicIntentReceiver extends BroadcastReceiver {

    public void onReceive(Context ctx, Intent intent) {
        AudioManager audioManager = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE);
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            Log.d("Let's turn the sound on!");
            //other things to un-mute the streams
        }
    }
}

Une autre solution à essayer?

28
Renato Lochetti

Que diriez-vous de cet appel: http://developer.Android.com/reference/Android/content/Intent.html#ACTION_HEADSET_PLUG que j'ai trouvé sur Droid Incredible Headphones Detection ?

Le code mis à jour que je vois dans votre question maintenant n'est pas suffisant. Cette diffusion se produit lorsque l'état branché change, et parfois quand ce n'est pas le cas, selon Intent.ACTION_HEADSET_PLUG est reçu au début de l'activité donc j'écrirais:

package com.example.testmbr;

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;
import Android.util.Log;

public class MainActivity extends Activity  {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myReceiver = new MusicIntentReceiver();
}

@Override public void onResume() {
    IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(myReceiver, filter);
    super.onResume();
}

private class MusicIntentReceiver extends BroadcastReceiver {
    @Override public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            int state = intent.getIntExtra("state", -1);
            switch (state) {
            case 0:
                Log.d(TAG, "Headset is unplugged");
                break;
            case 1:
                Log.d(TAG, "Headset is plugged");
                break;
            default:
                Log.d(TAG, "I have no idea what the headset state is");
            }
        }
    }
}

@Override public void onPause() {
    unregisterReceiver(myReceiver);
    super.onPause();
}
}

L'appel AudioManager.isWiredHeadsetOn () que j'ai recommandé plus tôt se révèle obsolète depuis l'API 14, je l'ai donc remplacé par l'extraction de l'état de l'intention de diffusion. Il est possible qu'il y ait plusieurs diffusions pour chaque branchement ou débranchement, peut-être à cause d'un rebond de contact dans le connecteur.

85
emrys57

Je n'ai pas travaillé avec ça, mais si je lis bien la documentation, ACTION_AUDIO_BECOMING_NOISY sert à faire savoir à une application que l'entrée audio peut commencer à entendre la sortie audio. Lorsque vous débranchez le casque, le micro du téléphone peut commencer à capter le haut-parleur du téléphone, d'où le message.

D'autre part, ACTION_SCO_AUDIO_STATE_UPDATED est conçu pour vous avertir en cas de changement de l'état de connexion d'un périphérique Bluetooth.

Ce deuxième est probablement ce que vous voulez écouter.

2
Steve Blackwell