检测耳机是否插入Android设备。
当你说“耳机”,你的意思是“有线耳机”?如果是这样,有意图检测是否正在插入或拔出插入:ACTION_HEADSET_PLUG
。
要检查状态,可以使用AudioManager.isWiredHeadsetOn()
,但如果还有蓝牙耳机,则可能会返回错误,并且将音频路由到该位置。
Hello Mike,如果有人使用Blutooth耳机,我该怎么办? – 2011-06-06 08:00:15
AudioManager.isWiredHeadsetOn()似乎总是返回false(在几个姜饼设备测试),在耳机是否被堵塞。如果你能提供一个工作代码示例,这将是巨大的。 – 2012-05-01 18:39:31
@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);
}
}
-cmcromance你能解释我的代码吗? – Sumit 2012-07-30 07:54:25
@Sumit对不起。我现在看到了你的重播。我可以为你解释我的代码吗? :) – cmcromance 2012-10-08 00:43:35
@Sumit好的。我想你不明白这一点。如果您添加“FLAG_RECEIVER_REGISTERED_ONLY”意图进行广播,那么只有当我在“AndroidManifest.xml”上的代码上执行“registerReceiver(...)”时,才能收到广播。 – cmcromance 2012-10-08 00:57:07
AudioManager.isWiredHeadsetOn()
总是返回false
,因为它需要用户的许可MODIFY_AUDIO_SETTINGS
。
我花了好几天,而找到答案。在官方文档中没有关于此的信息。而这bug
已经在BugTracker
注册。
我开发一个应用程序......我需要知道它肯定....用户也可以欺骗,如果我提示他我编辑你的问题的问题 – 2011-06-06 07:47:41
,如果它不是你要问,请纠正它。 – Mudassir 2011-06-06 08:37:04
@Mudassir感谢您更正:) – 2011-06-06 08:51:26