我试过这些手机: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();
}
}
}
答案 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。超级怪异......