Android 检查耳机是否已插入

Android 检查耳机是否已插入,android,audio,headphones,Android,Audio,Headphones,我似乎找不到办法在android上知道耳机是否插好了。我找到了各种各样的解决方案,但它们似乎总是返回错误。 唯一能正常工作的是广播接收器,但这不是我需要的: 我只需要这样的东西 if(headphones plugged in) { } 有这样的功能吗?它需要一些特殊权限吗?您可以使用此代码检查耳机是否已插入 AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); audioManag

我似乎找不到办法在android上知道耳机是否插好了。我找到了各种各样的解决方案,但它们似乎总是返回错误。 唯一能正常工作的是
广播接收器
,但这不是我需要的:

我只需要这样的东西

if(headphones plugged in) {
}

有这样的功能吗?它需要一些特殊权限吗?

您可以使用此代码检查耳机是否已插入

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.isWiredHeadsetOn();
(不用担心会遭到反对,它仍然只用于检查耳机是否已插入。)

你需要

在Android 2.0+中可用。

使用此代码

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

AudioManager.isWiredHeadsetOn()已被弃用。 因此,您需要使用以下方法:

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.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;
    }
}

许可。这就是为什么我第一次尝试这个解决方案时它没有起作用。有没有一种方法可以在不涉及上下文的情况下做到这一点?@dosse91214权限有什么问题?如果不添加权限,isWiredHeadsetOn()将始终返回false。是的,这就是我的意思。我第一次尝试这个解决方案时,它没有提到我必须添加权限。谢谢:DGreat除了这个方法在API 14中被弃用外-@Phil Stackoverflow不是关于谁将获得积分,而是关于帮助他人和分享知识。我不在乎评级。请随意将其作为答案发布,而不是告诉我解决方案,我将ping此线程的所有者以接受您的答案。AudioManager类型中的方法isWiredHeadsetOn()不受欢迎。此方法仅从API级别23开始工作。你知道如何将它用于LoverAPI级别吗,比如说19?干净,就行了。谢谢,欢迎来到SO!只有代码的答案是无用的,即使是正确的。试着解释一下你所附的东西
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;
}