检查耳机是不是插入

Posted

技术标签:

【中文标题】检查耳机是不是插入【英文标题】:Check whether headphones are plugged in检查耳机是否插入 【发布时间】:2013-04-29 23:46:23 【问题描述】:

我似乎无法在 android 上找到一种方法来了解耳机是否已插入。我找到了各种解决方案,但它们似乎总是返回 false。 唯一似乎可以正常工作的是BroadcastReceiver,但这不是我需要的:

我只需要这样的东西

if(headphones plugged in) 

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

【问题讨论】:

***.com/questions/6249023/… ***.com/questions/13610258/… 【参考方案1】:

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

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

(不用担心被弃用,它仍然可用于检查耳机是否已插入。)

你需要 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

适用于 Android 2.0 +

【讨论】:

权限。这一定是我第一次尝试该解决方案时它不起作用的原因。有没有办法在不涉及上下文的情况下做到这一点? @dosse91214 权限有什么问题?如果你不添加权限,isWiredHeadsetOn() 总是会返回 false。 是的,这就是我的意思。我第一次尝试这个解决方案时并没有提到我必须添加权限。谢谢:D 很好,只是此方法在 API 14 中已被弃用 - developer.android.com/reference/android/media/… @Phil *** 不是关于谁将获得学分,而是关于帮助他人和分享知识。我不在乎评分。请随意将其发布为答案,而不是告诉我解决方案,我会 ping 此线程的所有者以接受您的答案。【参考方案2】:

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;
    

【讨论】:

这只能从 API 级别 23 开始工作。知道如何将它用于情人 API 级别,比如 19 吗?【参考方案3】:

使用此代码...

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

【讨论】:

AudioManager 类型的方法 isWiredHeadsetOn() 已弃用【参考方案4】:

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;

【讨论】:

欢迎来到 SO!只用代码的答案是没有用的,即使是正确的。试着解释一下你附上的东西

以上是关于检查耳机是不是插入的主要内容,如果未能解决你的问题,请参考以下文章

你能判断耳机/耳机是不是插入WP8

检测耳机是不是插入 iPhone

通过AppWidgetProvider判断耳机是不是插入,拔出时暂停音乐

联想Y50耳机插入耳机孔后没有声音解决办法

电脑插入耳机后声音还是从电脑端发出

win7无声音显示“未插入扬声器或耳机” 怎么解决