在Android中广播ACTION_HEADSET_PLUG的问题

时间:2010-03-26 16:31:35

标签: android broadcast

我试过这些手机: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)为状态+麦克风发送空值,将“无设备”作为名称发送,并为状态+麦克风发送空值,将“Stereo HeadSet”/“Stereo HeadPhones”作为名称发送当耳机/耳机插入时。

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

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

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

更新:

主要活动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();
    }
}

}

3 个答案:

答案 0 :(得分:3)

代码错了!

“state”和“microphone”是整数,而不是字符串。所以代码应该修改如下:

    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);

有效!

答案 1 :(得分:1)

  

广播在活动开始时出现(不是预期的)

在registerReceiver的文档中:

  

系统可以广播“粘性”的意图 - 这些意图在广播结束后保持不变,以便发送到任何以后的注册。 如果您的IntentFilter与其中一个粘性Intent匹配,则此功能将返回该Intent并将其发送到您的接收器,就好像刚刚广播过一样。

我的猜测原因是你的活动有机会在你注册之后立即获得这种“粘性”广播的当前状态。

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

答案 2 :(得分:0)

愚蠢的我,问题略有不同 - '州'和'名字'没有'麦克风'。另一件事 - 耳机的'state'为0和1,耳机为0和3。超级怪异......