1

我试过这些手机:摩托罗拉 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,当耳机/耳机拔出时发送“无设备”作为名称,并为状态 + 麦克风发送 null,“立体声耳机”/“立体声耳机”作为耳机/时的名称耳机插上。

更新:T-Mobile G1 与 1.6 的行为与 Backflip 手机相同。

Nexus 更糟糕的是,它总是为状态 + 麦克风发送 null,当耳机/耳机插入或拔出时,“耳机”作为名称。

问题:如何解释 API 在 1.5 和 2.1 版本以及不同的设备和制造商上都被破坏了这么多?

更新:

主Activity的onCreate中的代码:

// Register receiver
    this.registerReceiver(new BroadcastsHandler(), new IntentFilter(Intent.ACTION_HEADSET_PLUG));

现在广播接收器的代码:

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 的文档中:

系统可能会广播“粘性”的 Intent——这些 Intent 在广播结束后仍然存在,以发送到任何以后的注册。如果您的 IntentFilter 匹配这些粘性 Intent 之一,该 Intent 将由该函数返回并发送到您的接收器,就好像它刚刚被广播一样。

我对原因的猜测是,您的 Activity 有机会在您注册后立即获得此类“粘性”广播的当前状态。

我目前正在使用需要接收 ACTION_HEADSET_PLUG 的 2 个设备的应用程序,并且似乎有些设备不发送此系统广播(我没有在平板电脑上接收它,但我在手机上接收它),因此可以得出结论,在注册此广播并且至少没有收到一次之后,设备不支持发送它。我还没有测试这是否也适用于其他系统广播,但我可以想象。

于 2013-09-24T13:21:17.473 回答
0

愚蠢的我,问题略有不同 - 没有“麦克风”,“状态”和“名称”就在那里。另一件事 - “状态”是耳机的 0 和 1,耳机的 0 和 3。超级诡异...

于 2010-04-07T19:07:04.587 回答