@ Ответ на вопрос 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.
См. Здесь: http://stackoverflow.com/questions/5264634/android-headphone-detection – bimmlerd