Я пробовал эти телефоны: Motorolla Backflip 1.5, Nexus One 2.1
По сути, я регистрирую BroadcastReceiver, чтобы получать трансляцию ACTION_HEADSET_PLUG, и просматриваю 3 дополнения, которые намереваются:
Вот описание из API:
* state - 0 for unplugged, 1 for plugged.
* name - Headset type, human readable string
* microphone - 1 if headset has a microphone, 0 otherwise
Проблема № 1: широковещательная рассылка происходит, когда начинается действие (не ожидается), когда происходит поворот экрана (не ожидается) и когда гарнитура / наушники подключены / отключены (ожидается).
Проблема №2: телефон Backflip (1.5) отправляет ноль для состояния + микрофон, «Нет устройства» в качестве имени, когда гарнитура / наушники отключены, и отправляет ноль для состояния + микрофон, «Stereo HeadSet» / «Stereo HeadPhones» в качестве имени когда гарнитура / наушники подключены.
ОБНОВЛЕНИЕ: T-Mobile G1 с 1.6 ведет себя так же, как телефон Backflip.
Nexus еще хуже, он всегда отправляет ноль для состояния + микрофон, «Гарнитура» в качестве имени, когда гарнитура / наушники подключены или отключены.
Вопрос: Как можно объяснить, что API так сильно сломан как на версиях 1.5 и 2.1, так и на разных устройствах производителей?
UPDATE:
Код в onCreate основной деятельности:
// Register receiver
this.registerReceiver(new BroadcastsHandler(), new IntentFilter(Intent.ACTION_HEADSET_PLUG));
Теперь код BroadcastReceiver:
public class BroadcastsHandler extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(Intent.ACTION_HEADSET_PLUG)) {
String data = intent.getDataString();
Bundle extraData = intent.getExtras();
String st = intent.getStringExtra("state");
String nm = intent.getStringExtra("name");
String mic = intent.getStringExtra("microphone");
String all = String.format("st=%s, nm=%s, mic=%s", st, nm, mic);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Headset broadcast");
builder.setMessage(all);
builder.setPositiveButton("Okey-dokey", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
}
}