Ответ 1
Как насчет этого вызова: http://developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG которые я нашел в Обнаружение невидимых наушников Droid
Обновленного кода, который я вижу в вашем вопросе, сейчас недостаточно. Эта передача происходит, когда включенное состояние изменяется, а иногда, когда это не так, согласно Intent.ACTION_HEADSET_PLUG принимается при запуске активности, поэтому я бы написал:
package com.example.testmbr;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MusicIntentReceiver();
}
@Override public void onResume() {
IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
registerReceiver(myReceiver, filter);
super.onResume();
}
private class MusicIntentReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
switch (state) {
case 0:
Log.d(TAG, "Headset is unplugged");
break;
case 1:
Log.d(TAG, "Headset is plugged");
break;
default:
Log.d(TAG, "I have no idea what the headset state is");
}
}
}
}
@Override public void onPause() {
unregisterReceiver(myReceiver);
super.onPause();
}
}
Вызов AudioManager.isWiredHeadsetOn(), который я ранее рекомендовал, оказывается устаревшим с API 14, поэтому я заменил его на извлечение состояния из намерения трансляции. Возможно, что для каждого подключения или отсоединения может быть несколько трансляций, возможно, из-за контактного отката в соединителе.