2011-06-06 77 views
25

如何確定耳機是否插入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

回答

25

當你說「耳機」,你的意思是「有線耳機」?如果是這樣,有意圖檢測是否正在插入或拔出插入: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

41

您可以使用廣播接收器。

所以,你可能會在 「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

14

AudioManager.isWiredHeadsetOn()總是返回false,因爲它需要用戶的許可MODIFY_AUDIO_SETTINGS

我花了好幾天,而找到答案。在官方文檔中沒有關於此的信息。而這bug已經在BugTracker註冊。