【发布时间】:2013-04-29 23:46:23
【问题描述】:
我似乎无法在 android 上找到一种方法来了解耳机是否已插入。我找到了各种解决方案,但它们似乎总是返回 false。
唯一似乎可以正常工作的是BroadcastReceiver,但这不是我需要的:
我只需要这样的东西
if(headphones plugged in) {
}
有这样的功能吗?是否需要一些特殊权限?
【问题讨论】:
标签: android audio headphones
我似乎无法在 android 上找到一种方法来了解耳机是否已插入。我找到了各种解决方案,但它们似乎总是返回 false。
唯一似乎可以正常工作的是BroadcastReceiver,但这不是我需要的:
我只需要这样的东西
if(headphones plugged in) {
}
有这样的功能吗?是否需要一些特殊权限?
【问题讨论】:
标签: android audio headphones
您可以使用此代码检查耳机是否已插入
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()+"");
【讨论】:
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;
}
【讨论】: