Подтвердить что ты не робот

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

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

Но когда пользователь снова подключит минигарнитуру, мне нужно отключить его. Но нет прямой трансляции 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 turn the sound on!");
            //other things to un-mute the streams
        }
    }
}

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

4b9b3361

Ответ 1

Как насчет этого вызова: http://developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG которые я нашел в Обнаружение невидимых наушников Droid

Обновленного кода, который я вижу в вашем вопросе, сейчас недостаточно. Эта передача происходит, когда включенное состояние изменяется, а иногда, когда это не так, согласно 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, поэтому я заменил его на извлечение состояния из намерения трансляции. Возможно, что для каждого подключения или отсоединения может быть несколько трансляций, возможно, из-за контактного отката в соединителе.

Ответ 2

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

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

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