Проверьте, подключены ли наушники

Я не могу найти способ узнать на Android, если наушники подключены. Я нашел различные решения, но они всегда, кажется, возвращают false. Единственное, что, кажется, работает правильно, это BroadcastReceiver, но это не то, что мне нужно:

Мне просто нужно что-то подобное

if(headphones plugged in) {
}

Есть ли такая функция? Требуются ли какие-то особые разрешения?

4 ответа

Решение

Вы можете использовать этот код для проверки, подключена ли гарнитура

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.isWiredHeadsetOn();

(Не беспокойтесь об устаревании, его можно использовать ТОЛЬКО для проверки, подключена ли гарнитура.)

А тебе нужно <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Доступно в Android 2.0 +

AudioManager.isWiredHeadsetOn() УСТАРЕЛО. Итак, вам нужно использовать метод AudioManager.getDevices():

private boolean isHeadphonesPlugged(){
        AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        AudioDeviceInfo[] audioDevices = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
        for(AudioDeviceInfo deviceInfo : audioDevices){
            if(deviceInfo.getType()==AudioDeviceInfo.TYPE_WIRED_HEADPHONES
                    || deviceInfo.getType()==AudioDeviceInfo.TYPE_WIRED_HEADSET){
                return true;
            }
        }
        return false;
    }

Используйте этот код...

AudioManager am1 = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
Log.i("WiredHeadsetOn = ", am1.isWiredHeadsetOn()+"");
Log.i("MusicActive = ", am1.isMusicActive()+"");
Log.i("SpeakerphoneOn = ", am1.isSpeakerphoneOn()+"");

Используйте API Google Awareness

Это очень богато, чтобы обеспечить контекстное чувство.

audioManager.isWiredHeadsetOn() устарело в соответствии с приведенным ниже кодом из android.media.AudioManager

/**
 * Checks whether a wired headset is connected or not.
 * <p>This is not a valid indication that audio playback is
 * actually over the wired headset as audio routing depends on other conditions.
 *
 * @return true if a wired headset is connected.
 *         false if otherwise
 * @deprecated Use {@link AudioManager#getDevices(int)} instead to list available audio devices.
 */
public boolean isWiredHeadsetOn() {
    if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET,"")
            == AudioSystem.DEVICE_STATE_UNAVAILABLE &&
        AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE,"")
            == AudioSystem.DEVICE_STATE_UNAVAILABLE &&
        AudioSystem.getDeviceConnectionState(DEVICE_OUT_USB_HEADSET, "")
          == AudioSystem.DEVICE_STATE_UNAVAILABLE) {
        return false;
    } else {
        return true;
    }
}

поэтому нам нужно использовать AudioManager#getDevices метод, как показано ниже

private boolean isWiredHeadsetOn(){
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    AudioDeviceInfo[] audioDevices = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
    for(AudioDeviceInfo deviceInfo : audioDevices){
        if(deviceInfo.getType()==AudioDeviceInfo.TYPE_WIRED_HEADPHONES
                || deviceInfo.getType()==AudioDeviceInfo.TYPE_WIRED_HEADSET){
            return true;
        }
    }
    return false;
}
Другие вопросы по тегам