2011-06-06 18 views

cevap

25

"Kulaklık" derken, "kablolu kulaklık" mı kastediyorsunuz? Eğer öyleyse, birinin takılıp takılmadığını veya takılmadığını tespit etmek için bir niyetiniz var: ACTION_HEADSET_PLUG.

Durumu denetlemek için, bir Bluetooth kulaklığı da varsa, bu hataya dönebilir ve ses bunun yerine yönlendirilir, ancak AudioManager.isWiredHeadsetOn()'u kullanabilirsiniz.

+3

Merhaba Mike, Birisi bir Blutooth kulaklık kullanıyorsa ne yapmalıyım? –

+0

AudioManager.isWiredHeadsetOn(), bir kulaklık takılı olsun ya da olmasın, her zaman false (birkaç Gingerbread aygıtında test edilmiştir) gibi görünüyor. Çalışan bir kod örneği sağlayabiliyorsanız, bu harika olur. –

+4

@ChadSchultz Açıklamada MODIFY_AUDIO_SETTINGS iznini eklemeniz gerekiyor. Bu yalnızca doğru duruma dönecektir. –

41

Sen yayın alıcısı kullanabilirsiniz.

Yani, sen "AndroidManifest.xml"

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

Ama bu kod yazmak olabilir Bu işe yaramaz. OS bu "HEADSET_PLUG" niyetini gönderdiğinde, OS "Intent.FLAG_RECEIVER_REGISTERED_ONLY" bayrağını ayarladı. Bu nedenle, "AndroidManifest" öğeleri yerine Activity veya Service sınıfında aşağıdaki kodu yazmanız gerekir.

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); 


} 

Umarım bu makale size yardımcı olur. Hoşçakal!

Bu "HeadsetObserver.java", Android SDK Kaynağı'nın bir parçasıdır. o kullanıcı izni MODIFY_AUDIO_SETTINGS gerektirdiğinden

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 kodunuzu açıklayabilir misiniz? – Sumit

+0

@Sumit Çok üzgünüm. Şimdi tekrarını gördüm. Kodumdan ne anlatabilirim senin için? :) – cmcromance

+0

@Sumit Ok. Bence bunu anlamıyorsun. Yayınlamak için "FLAG_RECEIVER_REGISTERED_ONLY" ifadesini eklerseniz, 'AndroidManifest.xml' kodunda sadece "registerReceiver (...)" yazdığımda yayınınızı alabilirim. – cmcromance

14

AudioManager.isWiredHeadsetOn() hep false dönün.

Cevabı bulan birkaç gün geçirdim. Bu konuyla ilgili resmi bilgi bulunmamaktadır. Ve bu bug zaten BugTracker kayıtlı.

İlgili konular