Android 安卓系统中的行动\耳机\插件广播问题

Android 安卓系统中的行动\耳机\插件广播问题,android,broadcast,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

我试过这些手机: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:Backflip phone(1.5)在拔出耳机/头戴式耳机时,将state+麦克风的名称“无设备”发送为空,在拔出耳机/头戴式耳机时,将state+麦克风的名称“立体声耳机”/“立体声头戴式耳机”发送为空

更新:T-Mobile G1和1.6的性能与Backflip手机相同

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

问:如何解释API在1.5版和2.1版以及不同的设备、制造商上都被破坏得如此严重

更新:

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

}我真傻,问题有点不同-“状态”和“名称”没有“麦克风”。另一件事——“状态”是0和1表示耳机,0和3表示耳机。超级奇怪…

我真傻,问题有点不同-“状态”和“名称”没有“麦克风”。另一件事——“状态”是0和1表示耳机,0和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);
它起作用了

代码错误

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

    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);
它起作用了

活动启动时广播(非预期)

在registerReceiver的文档中:

系统可能会广播“粘性”的意图——这些意图会在广播结束后保留,并发送给以后的注册如果您的意向过滤器与这些粘性意向中的一个相匹配,则此函数将返回该意向,并将其发送给您的接收器,就像它刚刚被广播一样。

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

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

活动启动时广播(非预期)

在registerReceiver的文档中:

系统可能会广播“粘性”的意图——这些意图会在广播结束后保留,并发送给以后的注册如果您的意向过滤器与这些粘性意向中的一个相匹配,则此函数将返回该意向,并将其发送给您的接收器,就像它刚刚被广播一样。

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


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

您能发布您的代码吗?奇怪的是,它是在活动开始和轮换时运行的。丹尼尔-查看postcan中的更新,请发布您的代码?奇怪的是,它是在活动开始和轮换时运行的。Daniel-请参阅文章中的更新“Larphoid您是否找到了不发送耳机插头的设备的解决方案?”。我需要解决这个问题:#Larphoid您是否找到了不发送耳机插头的设备的解决方案。我需要解决这个问题: