android 实时监测耳机(头戴设备)插入状态
(2013-02-22 11:24:41)
在应用中,想实时去监测是否耳机处于插入状态,有两种方式。提一句,不是接受广播,只有在插拔的动作时候才会发送广播,注意区别动作和状态。例如,耳机已经插上了,再启动应用,那应用就不能接受广播,这个时候要判断耳机插入状态,就需要我们说的两种方式。
int headsetState = 0;
len = file.read(buffer, 0, 1024);
//分别表示耳机连接或者耳机和麦克风都连接
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.hasExtra("state")) {
if (intent.getIntExtra("state", 2) == 0){
//拔出
}
else if (intent.getIntExtra("state", 2) == 1) {
//插入
}
}
BroadcastReceiver INSTANCE = new HeadSetPlugListenner();
context.unregisterReceiver(INSTANCE);
1.API提供的方法。需要使用系统的服务,代码如下:
AudioManager audioManager
= (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
boolean isHeadsetOn=audioManager.isWiredHeadsetOn();
isHeadsetOn
这即是插入状态,看起来非常简单。但是你会发现你的程序得到的总是false,这是因为调用系统服务都是需要权限的。而android应用的结构使你无法在代码中来更改权限,只能在AndroidManifest.xml中进行修改,所以这就为如果要开发API的人留下一个小遗憾。
权限是:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
2.android底层有很多个接口来反应耳机插入状态的,其根本原理是耳机插入和拔出状态的电平是不同的。因为android是开源的,而且版本很多,所以未必每个手机厂家都会去实现同一个接口。实际上,上面的
isWiredHeadsetOn()方法就是这些接口在上层的体现。我们可以绕过中间层,直接去读取底层接口的值,来判断。但是这样的方法不是对每个手机都有效,比如未实现那个接口的。在2.3之后的手机可以这样做:
boolean isHeadsetOn=false;
String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";//这就是其中一个接口
int len = 0;
try {
FileReader file = new FileReader(HEADSET_STATE_PATH);
char[] buffer = new char[1024];
try {
} catch (IOException e) {
}
headsetState = Integer.valueOf(new String(buffer, 0,len).trim());
} catch (FileNotFoundException e) {
}
if (headsetState > 0) {//大多数手机这个值是1或者2,但是也有不少手机是100多,
isHeadsetOn=true;
}else{//-1或者其他负数表示拔出
isHeadsetOn=false;
}
isHeadsetOn就是实时状态。
------------------------------------------------------------------------------
------------------------------------------------------------------------------
上面是获取耳机的实时状态,而有时候我们只需知道耳机的插拔状态,来完成一些工作。
插拔耳机时候,系统会发送"
android.intent.action.HEADSET_PLUG"的Intent,我们可以注册监听器,来接收这个广播。但是这个接收器必须在代码中动态注册,而不是manifest中注册,否则onReceive不会被回调。
这个Intent有三个附带的值:
state —— 0代表拔出,1代表插入
name——字符串,代表headset的类型
microphone —— 1代表插入的headset有麦克风,0表示没有麦克风
我们可以使用这3个值来实现一些功能。
简单给出一个检测耳机插拔的流程:
1.继承广播接收器
class HeadSetPlugListenner extends BroadcastReceiver {
}
}
2.注册。
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.HEADSET_PLUG");
// 或者使用Intent.ACTION_HEADSET_PLUG
context.registerReceiver(
INSTANCE
, filter);
3.使用完毕后,取消注册。