检测耳机是否插入Android设备。

问题描述:

如何确定耳机是否插入Android设备?检测耳机是否插入Android设备。

+0

我开发一个应用程序......我需要知道它肯定....用户也可以欺骗,如果我提示他我编辑你的问题的问题 – 2011-06-06 07:47:41

+0

,如果它不是你要问,请纠正它。 – Mudassir 2011-06-06 08:37:04

+0

@Mudassir感谢您更正:) – 2011-06-06 08:51:26

当你说“耳机”,你的意思是“有线耳机”?如果是这样,有意图检测是否正在插入或拔出插入:ACTION_HEADSET_PLUG

要检查状态,可以使用AudioManager.isWiredHeadsetOn(),但如果还有蓝牙耳机,则可能会返回错误,并且将音频路由到该位置。

+3

Hello Mike,如果有人使用Blutooth耳机,我该怎么办? – 2011-06-06 08:00:15

+0

AudioManager.isWiredHeadsetOn()似乎总是返回false(在几个姜饼设备测试),在耳机是否被堵塞。如果你能提供一个工作代码示例,这将是巨大的。 – 2012-05-01 18:39:31

+4

@ChadSchultz您需要在清单中添加权限MODIFY_AUDIO_SETTINGS。然后只有它会返回正确的状态。 – 2014-02-13 13:56:49

您可以使用广播接收器。

所以,你可能会在 “AndroidManifest.xml中”

<receiver android:name="com.juno.brheadset.HeadsetStateReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.HEADSET_PLUG"/> 
    </intent-filter> 
</receiver>--> 

但写这样的代码,这是行不通的。当OS发出这个“HEADSET_PLUG”的意图,OS设置标志“Intent.FLAG_RECEIVER_REGISTERED_ONLY”所以,你应该写在活动或服务类,而不是“AndroidManifest”之类的东西下面的代码。

public class BRHeadsetActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 
    HeadsetStateReceiver receiver = new HeadsetStateReceiver(); 
    registerReceiver(receiver, receiverFilter); 


} 

我希望这篇文章对您有所帮助。再见!

这是 “HeadsetObserver.java”,那么Android SDK源代码的一部分。

private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) { 
    if ((headsetState & headset) != (prevHeadsetState & headset)) { 
     // Pack up the values and broadcast them to everyone 
     Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG); 

     **intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);** 

     int state = 0; 
     int microphone = 0; 

     if ((headset & HEADSETS_WITH_MIC) != 0) { 
      microphone = 1; 
     } 
     if ((headsetState & headset) != 0) { 
      state = 1; 
     } 
     intent.putExtra("state", state); 
     intent.putExtra("name", headsetName); 
     intent.putExtra("microphone", microphone); 

     if (LOG) Slog.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone); 
     // TODO: Should we require a permission? 
     ActivityManagerNative.broadcastStickyIntent(intent, null); 
    } 
} 
+1

-cmcromance你能解释我的代码吗? – Sumit 2012-07-30 07:54:25

+0

@Sumit对不起。我现在看到了你的重播。我可以为你解释我的代码吗? :) – cmcromance 2012-10-08 00:43:35

+0

@Sumit好的。我想你不明白这一点。如果您添加“FLAG_RECEIVER_REGISTERED_ONLY”意图进行广播,那么只有当我在“AndroidManifest.xml”上的代码上执行“registerReceiver(...)”时,才能收到广播。 – cmcromance 2012-10-08 00:57:07

AudioManager.isWiredHeadsetOn()总是返回false,因为它需要用户的许可MODIFY_AUDIO_SETTINGS

我花了好几天,而找到答案。在官方文档中没有关于此的信息。而这bug已经在BugTracker注册。