【问题标题】:Issues with ACTION_HEADSET_PLUG broadcast in AndroidAndroid 中的 ACTION_HEADSET_PLUG 广播问题
【发布时间】:2010-03-26 16:31:35
【问题描述】:

我试过这些手机:摩托罗拉 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:在 Activity 启动(非预期)、屏幕旋转发生(非预期)以及耳机/耳机插入/拔出(预期)时进行广播。

问题 #2:后翻手机 (1.5) 为状态 + 麦克风发送 null,当耳机/耳机拔出时,“No Device”作为名称,并为状态 + 麦克风发送 null,“Stereo HeadSet”/“Stereo HeadPhones”作为名称当耳机/耳机插入时。

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

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

问题:如何解释 API 在 1.5 和 2.1 版本以及不同的设备、制造商上出现如此大的问题?

更新:

主Activity的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();
    }
}

}

【问题讨论】:

  • 您能发布您的代码吗?它在活动开始和旋转时运行,这很奇怪。
  • 丹尼尔 - 查看帖子中的更新

标签: android broadcast


【解决方案1】:

代码错误!

“状态”和“麦克风”是整数,而不是字符串。所以代码应该修改如下:

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

有效!

【讨论】:

    【解决方案2】:

    在活动开始时进行广播(不是预期的)

    在 registerReceiver 的文档中:

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

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多