android蓝牙耳机下的语音(输入/识别)及按键监听
第一次在csdn写博客,在此把自己折腾了两三天的一个问题的解决过程记录一下。
背景:本人负责公司android平台的app开发,最近要开发一个语音助手类的app,类似于灵犀语音助手、虫洞语音助手等。其中有两个蓝牙耳机下的语音识别问题,比较折腾人,问题描述:1.蓝牙耳机连接下捕获蓝牙按键事件,启动语音识别;2.正常启动识别时也必须通过蓝牙耳机录入音频进行语音识别。这两个问题,测试发现灵犀语音助手都解决了,所以本人负责的这个app也必须解决。网上搜了相关的资料,基本上是凤毛麟角,因此本人在此贡献一点小发现供大家参考,如有不对的地方欢迎指正。
针对第一个问题,蓝牙耳机的按键监听,墙内墙外的资料搜遍,没有发现完美的解决方案(这里看到有人提出的解决办法:http://blog.csdn.net/kangear/article/details/40430673,感觉有点另类,而且也不适合我的app的应用场景,所以没尝试),虽然接听键(该键还有很多功能,不细说,以下都称接听键)的单按、双按没法监听,但是长按却是可以捕获到,默认情况下,已经连接到android手机的蓝牙耳机,长按接听键几秒后会系统会发出一个action=android.intent.action.VOICE_COMMAND的Intent,灵犀语音助手就是使用这个来监听长按的,既然如此,我就仿照灵犀来做吧:
1.首先,在AndroidManifest.xml中指定的一个activity (用于捕获蓝牙耳机长按事件的activity,以下以A代替之)中添加:
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.VOICE_COMMAND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
当在连接了蓝牙耳机的情况下,长按接听键几秒,出现提示音后(请戴着蓝牙耳机按,要不听不见,一不小心就成关机了),马上松开,就会弹出一个选择启动某个app的对话框,凡是添加了以上intent-filter的activity的app都会出现对话框中,这需要引导用户选择你的app并选择始终启动你的app(注意A的launchMode,我这里建议设成singleTask),选中确定之后你的app就会被启动,如果A还没有创建,那A自然会被创建啦,如果A已经被创建了,则调用A的onNewIntent(Intent intent)方法,因此你只要在A中检查接收到的intent的action就能监听蓝牙耳机的长按事件了。
2.关于蓝牙耳机下的识别问题,本app用的语音识别sdk是讯飞的,针对这个问题讯飞有给出解决方法:
在调用语音识别引擎识别前,打开sco,关键代码:
AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setBluetoothScoOn(true);
mAudioManager.startBluetoothSco();
识别启动并识别完成后,关闭sco:
mAudioManager.setBluetoothScoOn(false);
mAudioManager.stopBluetoothSco();
按照这个方法,便可以实现音频录入。
当然你会问why,这里简单的介绍一下蓝牙耳机的两种链路,A2DP及SCO。android的api表明:A2DP是一种单向的高品质音频数据传输链路,通常用于播放立体声音乐;而SCO则是一种双向的音频数据的传输链路,该链路只支持8K及16K单声道的音频数据,只能用于普通语音的传输,若用于播放音乐那就只能呵呵了。两者的主要区别是:A2DP只能播放,默认是打开的,而SCO既能录音也能播放,默认是关闭的。既然要录音肯定要打开sco啦,因此识别前调用上面的代码就可以通过蓝牙耳机录音了,录完记得要关闭。
虽然上面的方法能够实现录音,但测试中发现一个问题:startBluetoothSco()和stopBluetoothSco()时,蓝牙耳机都会有一个提示音,如果识别本身就有提示音,那么加上蓝牙的提示音就会让人莫名其妙了,在体验上很不友好。而本人在测试灵犀的蓝牙功能时竟发现没有提示音?为了完整的复制,必须把提示音去掉,然后我又上网搜了一遍,资料真的是凤毛麟角,没什么收获。无奈中翻翻android关于蓝牙部分的api,发现打开及关闭sco还有另外一种办法,那就是android.bluetooth.BluetoothHeadset类的startVoiceRecognition(BluetoothDevice device)及stopVoiceRecognition(BluetoothDevice device),经过测试发现,通过这两个方法打开sco及关闭sco蓝牙耳机是不会有提示音,题外说一句:讯飞真会坑!!!下面列出关键代码:
//以下代码用于在已经连接蓝牙耳机的状态下获取BluetoothHeadset,监听蓝牙耳机的连接只需接收action=BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED的广播即可,此处不再赘述。
private BluetoothHeadset bluetoothHeadset;
BluetoothProfile.ServiceListener blueHeadsetListener=new BluetoothProfile.ServiceListener() {
@Override
public void onServiceDisconnected(int profile) {
Log.i("blueHeadsetListener", "onServiceDisconnected:"+profile);
if(profile==BluetoothProfile.HEADSET){
bluetoothHeadset=null;
}
}@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
Log.i("blueHeadsetListener", "onServiceConnected:"+profile);
if(profile==BluetoothProfile.HEADSET){
bluetoothHeadset=(BluetoothHeadset) proxy;
}
}
};private void initBlueToothHeadset(){
BluetoothAdapter adapter;
if(android.os.Build.VERSION.SDK_INT<android.os.Build.VERSION_CODES.JELLY_BEAN_MR2){//android4.3之前直接用BluetoothAdapter.getDefaultAdapter()就能得到BluetoothAdapter
adapter=BluetoothAdapter.getDefaultAdapter();
}
else{
BluetoothManager bm=(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
adapter=bm.getAdapter();
}
adapter.getProfileProxy(context, blueHeadsetListener, BluetoothProfile.HEADSET);
}
android蓝牙耳机下的语音(输入/识别)及按键监听相关推荐
- Android模仿淘宝语音输入条形动画,录音动画自定义View
Android模仿淘宝语音输入条形动画自定义View,类似柱状音频,折线音频,音乐跳动,音频跳动,录音动画,语音输入效果 地址: https://github.com/xfans/VoiceWaveV ...
- android全局监听onkeydown,Android中的几个onTouch()事件、onKeyDown监听返回键无效
Android中的几个onTouch()事件.onKeyDown监听返回键无效 一:Android中的几个onTouch()事件 继承SimpleOnGestureListener,HahaGestu ...
- 跨平台Android和IOS百度语音在线识别原生插件
一.插件推荐 跨平台Office文档.图片在线预览,视频播放原生插件 Android和IOS图片在线预览,视频播放原生插件 跨平台Android和IOS百度OCR文字识别.证卡识别.票据识别原生插件 ...
- Android 判断是否有语音输入的方法
在app开发音频输入的相关项目中,需要判断当前话筒是否有语音输入,可以通过AudioRecord来处理用户输入的原始音频数据,然后对音频数据进行分析,判断音量大小来确定有没有音量输入 具体实现工具类: ...
- Android 类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现
最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现. 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录.在EditText里输入要搜索的关键字 ...
- android底层按键监听,Android应用中Back键的监听及处理实例
MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...
- linux oracle新建监听,linux 下 oracle图形界面(需配置监听,创建实例)
摘要:oracle 图形界面配置监听,创建实例,以下都是我安装是的截图,按步骤一定可以安装成功! CentOS6.7_x64_minimal_desktop的虚拟机一台(安装oracle需要图形界面, ...
- ubuntu下搭载LNMP环境,解决 fpm监听失败
为什么80%的码农都做不了架构师?>>> 1.安装mysql sudo apt-get install mysql-server mysql-client 安装过程中要输入ro ...
- 扫码枪输入mysql_使用jQuery监听扫码枪输入并禁止手动输入的实现方法
@(知识点总结)[jquery|扫码抢] 基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条 ...
最新文章
- java ide 2017_Intellij ide 2017.2新建javaweb项目,并且部署
- mas714 笔记:undecidability
- shell 死循环if判断_Shell的条件判断
- Tableau上面地图与条形图结合_何为计算的详细级别,认识Tableau中的Level of Detail...
- css编写的技巧效果总结
- deepin nginx连接php,利用docker运行nginx加上本机的php-fpm。访问html文件正常,但是访问php文件就报错404...
- RMAN catalog 的创建和使用
- 用Oracle归档日志进行恢复方法
- 目标检测——域适应的学习笔记
- html 动画过度转换的用法,css(动画,过渡,转换)
- envi 打开影像报错:‘HISTOGRAM:illegal binsize or max/min‘.The result maybe invalid
- sqlh和mysql的区别_HSQL和MySQL的区别
- 苹果logo_苹果LOGO起拍价2万美元?
- 嘘...偷偷教你破解“朋友圈三天可见”
- matlab偏最小二乘截距,matlab代写偏最小二乘回归(PLSR)和主成分回归(PCR)
- 制造型企业如何上云?
- 用python来实现输出 1-1000的素数,并且按照每8个一行输出
- html实现点赞效果,HTML+CSS入门 点赞功能实现 $(tag).css('属性', '样式')
- 江苏高等学校计算机等级考试大纲与样卷,江苏省高等学校计算机等级考试大纲(2015 年修订).pdf...
- idea登录gitee插件报错Unauthorized -null