1

試した携帯電話: 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();
    }
}

}

4

3 に答える 3

3

コードが間違っています!

「状態」と「マイク」は文字列ではなく整数です。したがって、コードを次のように変更する必要があります。

    int st = intent.getIntExtra("state" , -1);
    String nm = intent.getStringExtra("name");
    int mic = intent.getIntExtra("microphone", -1);
    String all = "st="+Integer.toString(st)+" nm="+nm+" mic="+Integer.toString(mic);

できます!

于 2011-10-18T05:41:54.813 に答える
1

アクティビティが開始されるとブロードキャストが来る (予期しない)

それは registerReceiver のドキュメントにあります:

システムは、「スティッキー」なインテントをブロードキャストする場合があります。これらは、ブロードキャストが終了した後も残り、後の登録に送信されます。IntentFilter がこれらのスティッキー インテントのいずれかに一致する場合、そのインテントはこの関数によって返され、ブロードキャストされたかのようにレシーバーに送信されます。

その理由についての私の推測では、Activity に登録した直後に、そのような「スティッキー」ブロードキャストの現在の状態を取得する機会があるためです。

私は現在、ACTION_HEADSET_PLUG を受信する必要がある 2 つのデバイスでアプリに取り組んでおり、このシステム ブロードキャストを送信しないデバイスがあるようです (タブレットでは受信していませんが、携帯電話では受信しています)。したがって、このブロードキャストに登録した後、少なくとも 1 回受信されていない場合、デバイスは送信をサポートしていないと結論付けることができます。これが他のシステム ブロードキャストにも適用されるかどうかはテストしていませんが、そうなると思います。

于 2013-09-24T13:21:17.473 に答える
0

愚かな私、問題は少し異なります-「状態」と「名前」は「マイク」なしでそこにあります。もう1つのこと-「状態」は、ヘッドフォンの場合は0と1、ヘッドセットの場合は0と3です。超変...

于 2010-04-07T19:07:04.587 に答える