試した携帯電話: 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: バックフリップ電話 (1.5) は、ヘッドセット/ヘッドフォンが取り外されたときに状態 + マイクの名前として「デバイスなし」を送信し、ヘッドセット/ヘッドフォンのときに名前として状態 + マイク、「ステレオ ヘッドセット」/「ステレオ ヘッドフォン」に対して null を送信します。ヘッドホンが差し込まれています。
更新: 1.6 の T-Mobile G1 は Backflip 電話と同じように動作します。
Nexus はさらに悪いことに、ヘッドセット/ヘッドフォンが接続または切断されたときに、状態 + マイクの場合は常に null を送信し、名前として「ヘッドセット」を送信します。
質問: API が 1.5 と 2.1 の両方のバージョンで、さまざまなデバイスやメーカーで壊れていることをどのように説明できますか?
アップデート:
メイン アクティビティの 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();
}
}
}