web-dev-qa-db-fra.com

Détecter si un casque est branché sur un appareil Android Android ou non.

Comment puis-je déterminer si un casque est branché sur un appareil Android Android ou non?

28
Coder_sLaY

Lorsque vous dites "casque", voulez-vous dire "casque filaire"? Si tel est le cas, il y a une intention de détecter si oui ou non l'un est branché ou débranché: ACTION_HEADSET_PLUG.

Pour vérifier l'état, vous pouvez utiliser AudioManager.isWiredHeadsetOn(), bien que cela puisse retourner faux s'il y a aussi un casque bluetooth, et l'audio est acheminé vers cela à la place.

29
EboMike

Vous pouvez utiliser le récepteur de diffusion.

Donc, vous pourriez écrire ce code dans "AndroidManifest.xml"

<receiver Android:name="com.juno.brheadset.HeadsetStateReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.HEADSET_PLUG"/>
    </intent-filter>
</receiver>-->

Mais cela ne fonctionne pas. Lorsque le système d'exploitation envoie cette intention "HEADSET_PLUG", le système d'exploitation définit l'indicateur "Intent.FLAG_RECEIVER_REGISTERED_ONLY". Vous devez donc écrire le code comme ci-dessous dans la classe Activity ou Service au lieu des éléments "AndroidManifest".

public class BRHeadsetActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    HeadsetStateReceiver receiver = new HeadsetStateReceiver();
    registerReceiver( receiver, receiverFilter );


}

J'espère que cet article vous aidera. Au revoir!

C'est la partie de "HeadsetObserver.Java", Android SDK Source.

private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) {
    if ((headsetState & headset) != (prevHeadsetState & headset)) {
        //  Pack up the values and broadcast them to everyone
        Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);

        **intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);**

        int state = 0;
        int microphone = 0;

        if ((headset & HEADSETS_WITH_MIC) != 0) {
            microphone = 1;
        }
        if ((headsetState & headset) != 0) {
            state = 1;
        }
        intent.putExtra("state", state);
        intent.putExtra("name", headsetName);
        intent.putExtra("microphone", microphone);

        if (LOG) Slog.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone);
        // TODO: Should we require a permission?
        ActivityManagerNative.broadcastStickyIntent(intent, null);
    }
}
45
cmcromance

AudioManager.isWiredHeadsetOn() renvoie toujours false car elle nécessite l'autorisation de l'utilisateur MODIFY_AUDIO_SETTINGS.

J'ai passé plusieurs jours en trouvant la réponse. Il n'y a aucune information à ce sujet dans la documentation officielle. Et ce bug déjà enregistré dans BugTracker.

15
user1777060
4
Ravi Vyas