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