Как определить, когда пользователь подключает гарнитуру к устройству Android? (Напротив ACTION_AUDIO_BECOMING_NOISY)

Я занимаюсь разработкой приложения, которое имеет следующий реквизит: если к устройству подключена гарнитура, а пользователь удаляет ее, мне нужно отключить звук всех потоков. Для этого мне нужно послушать AudioManager.ACTION_AUDIO_BECOMING_NOISY Broadcast. Хорошо! Не проблема здесь.

Но когда пользователь снова подключает гарнитуру, мне нужно включить звук устройства. Но нет AudioManager.ACTION_AUDIO_BECOMING_NOISY обратная трансляция. Я не могу знать, когда гарнитура снова подключена.

Одним из решений является периодически видеть, если AudioManager.isWiredHeadsetOn() является true но это не кажется хорошим решением для меня.

Есть ли способ определить, когда пользователь подключает гарнитуру к устройству?

Отредактировано: я пытался использовать Intent.ACTION_HEADSET_PLUG таким образом, но это не сработало.

В manifest.xml я положил:

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

И вот код моего 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
        }
    }
}

Любое другое решение попробовать?

2 ответа

Решение

Как насчет этого звонка: http://developer.android.com/reference/android/content/Intent.html, который я нашел в Droid Incredible Headphone Detection?

Обновленного кода, который я вижу в вашем вопросе, сейчас недостаточно. Эта трансляция происходит, когда подключенное состояние изменяется, а иногда и нет, в соответствии с Intent.ACTION_HEADSET_PLUG принимается при запуске активности, поэтому я бы написал:

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();
}
}

Вызов AudioManager.isWiredHeadsetOn(), который я ранее рекомендовал, оказывается устаревшим с API 14, поэтому я заменил его на извлечение состояния из намерения вещания. Возможно, что для каждого подключения или отключения может быть несколько трансляций, возможно, из-за отказов контактов в разъеме.

Я не работал с этим, но если я правильно читаю документы, ACTION_AUDIO_BECOMING_NOISY предназначен для уведомления приложения о том, что аудиовход может начать слышать аудиовыход. Когда вы отключите гарнитуру, микрофон телефона может начать поднимать динамик телефона, отсюда и сообщение.

С другой стороны, ACTION_SCO_AUDIO_STATE_UPDATED предназначен для оповещения об изменении состояния подключения устройства Bluetooth.

Этот второй, вероятно, то, что вы хотите слушать.

Другие вопросы по тегам