android 实时监测耳机

在应用中,想实时去监测是否耳机处于插入状态,有两种方式。提一句,不是接受广播,只有在插拔的动作时候才会发送广播,注意区别动作和状态。例如,耳机已经插上了,再启动应用,那应用就不能接受广播,这个时候要判断耳机插入状态,就需要我们说的两种方式。
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 headsetState = 0;
int len = 0;
try {
FileReader file = new FileReader(HEADSET_STATE_PATH);
char[] buffer = new char[1024];
try {
  len = file.read(buffer, 0, 1024);
} 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 { 
 @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) { 
                                //插入
                          }
  }
}
}
2.注册。
                 BroadcastReceiver INSTANCE = new HeadSetPlugListenner();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.HEADSET_PLUG");
// 或者使用Intent.ACTION_HEADSET_PLUG
context.registerReceiver( INSTANCE , filter);
3.使用完毕后,取消注册。
               context.unregisterReceiver(INSTANCE);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值