2015-03-29 3 views
0

Я программирую в последние годы на Android, и мне интересно:Обнаружение наушников Android

Как определить наличие наушников?
Существует способ: isWiredHeadsetOn(), но он не работает.

Я пробовал это, но он не работает:

AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE); 
Log.i("am.isWiredHeadsetOn()", am.isWiredHeadsetOn() + ""); 

if (am.isWiredHeadsetOn()) { 
    //code 
} 

Спасибо (и извините, если я сделал орфографические ошибки, я французский)

+1

См. Здесь: http://stackoverflow.com/questions/5264634/android-headphone-detection – bimmlerd

ответ

0

AudioManager.isWiredHeadsetOn(), как представляется Правильная вещь. В соответствии с Android документ Разработчик:

Checks whether a wired headset is connected or not. 

This is not a valid indication that audio playback is actually over the wired headset as audio routing depends on other conditions. 

Returns 
true if a wired headset is connected. false if otherwise 

Но:

  • вы должны добавить соответствующий разрешение на манифесте (MODIFY_AUDIO_SETTINGS)
  • согласно this post, это не очень хорошо работает с Bluetooth гарнитура.
0

Если у вас все в порядке с Зефиром, а AudioDeviceCallback может быть тем, что вы ищете. Он работает с AudioManager и сообщает вам, когда что-либо подключается и отключается.

1

@ Ответ на вопрос https://stackoverflow.com/a/19102661/4758255 - хорошая реализация для обнаружения наушников.

Здесь я цитирую его ответ. Пожалуйста, подтвердите свой ответ не так!

Upvote ответа: https://stackoverflow.com/a/19102661/4758255


Я имел приложение в магазине в течение трех лет, которые мониторят как проводная гарнитура и состояние Bluetooth и никто никогда не жаловались на разряде батареи. Но это потому, что я успешно использую один сервис и широковещательный приемник для обнаружения событий от обоих. Вот два ключевых классов:

public class HeadsetStateBroadcastReceiver extends BroadcastReceiver { 

    public static final String[] HEADPHONE_ACTIONS = { 
     Intent.ACTION_HEADSET_PLUG, 
     "android.bluetooth.headset.action.STATE_CHANGED", 
     "android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED" 
    }; 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 

     boolean broadcast = false; 

     // Wired headset monitoring 
     if (intent.getAction().equals(HEADPHONE_ACTIONS[0]) { 
      final int state = intent.getIntExtra("state", 0); 
      AudioPreferences.setWiredHeadphoneState(context, state > 0); 
      broadcast = true; 
     } 

     // Bluetooth monitoring 
     // Works up to and including Honeycomb 
     if (intent.getAction().equals(HEADPHONE_ACTIONS[1])) { 
      int state = intent.getIntExtra("android.bluetooth.headset.extra.STATE", 0); 
      AudioPreferences.setBluetoothHeadsetState(context, state == 2); 
      broadcast = true; 
     } 

     // Works for Ice Cream Sandwich 
     if (intent.getAction().equals(HEADPHONE_ACTIONS[2])) { 
      int state = intent.getIntExtra("android.bluetooth.profile.extra.STATE", 0); 
      AudioPreferences.setBluetoothHeadsetState(context, state == 2); 
      broadcast = true; 
     } 

     // Used to inform interested activities that the headset state has changed 
     if (broadcast) { 
      LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("headsetStateChange")); 
     } 

    } 

} 

Вот это услуга, я использую, чтобы зарегистрировать вещательный приемник:

public class HeadsetMonitoringService extends Service { 

    HeadsetStateBroadcastReceiver headsetStateReceiver; 

    @Override 
    public void onCreate() { 

     headsetStateReceiver = new HeadsetStateBroadcastReceiver(); 
     final IntentFilter filter = new IntentFilter(); 
     for (String action: HeadsetStateBroadcastReceiver.HEADPHONE_ACTIONS) { 
      filter.addAction(action); 
     } 

     registerReceiver(headsetStateReceiver, filter); 

    } 

    @Override 
    public int onStartCommand(final Intent intent, final int flags, final int startId) { 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     unregisterReceiver(headsetStateReceiver); 
    } 

    @Override 
    public IBinder onBind(final Intent intent) { 
     return null; 
    } 

} 

И вот мой манифест запись:

<service 
     android:name=".services.HeadsetMonitoringService" 
     android:enabled="true" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="initialiseHeadsetService" /> 
     </intent-filter> 
    </service> 

Как это работает является следующим:

Я использую загрузку приемник oadcast для отправки стартового служебного сообщения в HeadsetMonitoringService (вам не нужно это делать, вы можете просто сделать это, когда ваше приложение запустится). Служба HeadsetMonitoringService, в свою очередь, регистрирует экземпляр широковещательного прослушивателя, который прослушивает все события гарнитуры, которые меня интересуют, - они хранятся в массиве HEADPHONE_ACTIONS. Потому что сервис липкий, он висит вокруг - и, следовательно, так же широковещательный прослушиватель. Но поскольку служба и прослушиватель вещания управляются событиями, они не потребляют никакой энергии до тех пор, пока не произойдет изменение состояния гарнитуры. Кроме того, поскольку служба является липкой, она будет перезапущена ОС, если она неожиданно умрет.
Всякий раз, когда я получаю событие изменения состояния гарнитуры, я также запускаю локальную трансляцию, чтобы заинтересованные действия могли проверять новое состояние и предпринимать действия, если это необходимо.

Для полноты я должен указать, что я использую другой класс (не показан здесь), AudioPreferences, для сохранения в качестве предпочтений как состояния Bluetooth, так и проводной гарнитуры, доступ к которому можно получить, когда мне нужно знать состояние гарнитуры.

Вашему заявлению потребуется разрешение android.permission.BLUETOOTH, если вас интересует состояние Bluetooth-гарнитуры. Если нет, просто выньте связанные с Bluetooth действия из массива HEADPHONE_ACTIONS и удалите связанные блоки if из метода onReceive.

Смежные вопросы