android检测耳机
A. 请教android里怎么判断扫描到的蓝牙设备是不是蓝牙耳机
如果是在代码中是无法判断的,除非你们对接的蓝牙耳机是有固定形号,或者只支持指定的蓝牙型号就可以通过蓝牙的getName来判断, 通常情况下是不能知道设备是什么的。
B. android 检测耳机是否插入
当然,要加个权限,不然一直是返回false。
<uses-permission android:name=android.permission.MODIFY_AUDIO_SETTINGS /
实时检测耳机插入和拔出:
每当插入和拔出耳机时,
系统都会发送Intent广播,这个由看手机打出的Log得知。
所以,只需要用一个receiver把这个广播intent(获取的action是:android.intent.action.HEADSET_PLUG)截获就好。
C. android 怎么判断连接了那个蓝牙耳机
ba = BluetoothAdapter.getDefaultAdapter();// int isBlueCon;//蓝牙适配器是否存在,即是否发生了错误 if (ba == null){// isBlueCon = -1; //error return -1; } else if(ba.isEnabled()) { int a2dp = ba.getProfileConnectionState(BluetoothProfile.A2DP); //可操控蓝牙设备,如带播放暂停功能的蓝牙耳机 int headset = ba.getProfileConnectionState(BluetoothProfile.HEADSET); //蓝牙头戴式耳机,支持语音输入输出 int health = ba.getProfileConnectionState(BluetoothProfile.HEALTH); //蓝牙穿戴式设备
D. Android怎样监听蓝牙耳机的按键事件
其实对于Android系统,每次按键只会有一个唯一“键值”响应,使用起来感觉会模模糊糊的,但是其实对于系统来说是很清晰的。
AVRCP全称(Audio/VideoRemoteControlProfile),是蓝牙协议中的一个profile。从名字上就可以看出主要应用于Audio/Video控制。每个按键并不是独立的,上-曲/下一曲是在正在播放音乐的时候才会有效,即才会向Android发送“键值”。
基于按键从Linux到Android分析具体对于的键值:
Linux扫描码功能映射字串Android键值
00c8200 开始放音乐MEDIA_PLAYKEYCODE_MEDIA_PLAY
00c9201 停止放音乐MEDIA_PAUSEKEYCODE_MEDIA_PAUSE
00a3163 下一曲MEDIA_NEXTKEYCODE_MEDIA_NEXT
00a5165 上-曲MEDIA_PREVIOUSKEYCODE_MEDIA_PREVIOUS
Android应用代码,完整测试应用:TeskKey。
总结:1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3号键会在播放音乐时分别发送KEYCODE_MEDIA_PREVIOUS/.KEYCODE_MEDIA_NEXT。如果想要把蓝牙耳机上的按键利用起来,可以在接收到KEYCODE_MEDIA_PLAY时播放无声音乐以使能2/3号键。这样就能完整接收3种键值了自行控制了。这个具体自行设计(测试代码已经更新包含了)。
注:这种实现并不一定通用,比如我在深度定制的MIUI中测试,尽管启动的TestKey应用,系统自带的音乐播放器仍然能同时响应键值。
更新:
已经更新TestKey源码,添加对蓝牙耳机按键的监听,实现方法就是上述中推测的方法,已经成功验证过了。播放音乐参考《Android多媒体开发--资源文件播放》。效果图:
问与答
1.这个只能在播放音乐的状态下才能监听到么?
答:根据上述的原理,这些按键也仅仅是应用在控制媒体时使用;且根据实际验证没有播放音乐时蓝牙耳机的2/3号键是并没有向Android设备发送键值(从底层Linux来看)。综上所述,需要通过播放音乐来实现激活其向Android设备发送键值,针对这种情况可以播放一个“没有声音”的音乐文件来实现,这样既可以监听到2/3号键又可以不影响其它声音的输出。可以在前台时播放音乐,后台停止播放。
2.我现在主要是想监听得到开关键(1号键)。 在做一个按下蓝牙开关键后启动一个语音识别的功能?
答:在我的测试条件下,1号键是可以正常监听到的。1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE键值。这个键不需要模拟播放音乐就可以正常的监听到。
3.4号按键的监听方法
答:所谓的4号按键,也就是指本文中的所测试型号的蓝牙耳机上并没有,但有可能其它型号的蓝牙耳机上有。我没有办法测试验证,所以这里就简单叙述一下“新按键”的键值确定思路:1.先使用TestKey测试应用测试按键,测试Android上层是否可以得到对应键值。2.如果没有得到,那么就使用adbshellgetevent来看Linux底层可以不可以得到键值。然后根据按键从Linux到Android来确定Android上层使用的键值码到底是多少。(当然,如果你实在不知道如何监听,把蓝牙耳机寄给我,我给你确定也行。:))
注:其实上述文章完全是根据按键从Linux到Android测试确定下来的。那是篇文章是剥开Android外壳来看“按键”事件的流程的,方法适用于所有输入事件:各种按键/触摸/物理键盘/鼠标等待输入设备。没有一定的Linux开发经验很难看懂和理解。
4.Android后台监听按键怎么实现
或:如何启动一次应用后在后台一直监听播放键因为有这样一个场景在用户开车的时候需按一下开关键就启动语音识别的功能。
这个问题其实已经超出了本文讨论的范围,是Android系统对应用层的键盘事件(按键)的分发的问题了。正常情况下,按键只会向当前最端的应用分发键盘事件,也就是说在后台你边音量键都监听不了。
但是既然这种情况(后台应用监听按键)的需求存在,那么就一定有它存在的道理。比如“相机键”,按下后直接调出相机到最前台。从表面上看是相机响应了按键,但是从实现方法上来看,并不是通过键值来操作,必须通过其它方法,比如广播或者其它等等。
明白了其中的道理后,那么想要实现就好办了。先看这个按键有没有广播,如要有接听系统中发出来的广播;如果没有那么对于定制系统可以自己在系统中添加一个广播;总之,正常渠道是没有办法在后台监听一些不应该是你监听到的按键的。
更:查了一下,这个按键是有广播的。这样就可以后台响应了(不需要C/不需要root)。例子我就不试了,见Android官方例子RandomMusicPlayer。
其中的重点是这个广播android.intent.action.MEDIA_BUTTON。
E. android系统检测不到耳机
重新刷系统,系统有问题了。
F. android检测用户是否插了耳机
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 开始我追了好久的源码。发现了实时检测耳机插入和拔出的过程,不过对我的需求来说帮助不是很大。在Android下实现检测耳机插入和拔出,也即建立一个Broadcast Receiver,监听“android.intent.action.HEADSET_PLUG”广播但直接在AndroidManifest.xml中添加一个<receiver>标签是无效的,如:<receiver android:name=".HeadsetPlugReceiver"> <intent-filter> <action android:name="android.intent.action.HEADSET_PLUG" android:enabled="true"></action> </intent-filter> </receiver> 你会发现Receiver的onReceive事件永远不会被触发,解决方法就是手动编写代码注册该广播。首先,创建一个BroadcastReceiver的子类,用于监听耳机插入和拔出:public class HeadsetPlugReceiver extends BroadcastReceiver { private static final String TAG = "HeadsetPlugReceiver"; @Override public void onReceive(Context context, Intent intent) { if (intent.hasExtra("state")){ if (intent.getIntExtra("state", 0) == 0){ Toast.makeText(context, "headset not connected", Toast.LENGTH_LONG).show(); } else if (intent.getIntExtra("state", 0) == 1){ Toast.makeText(context, "headset connected", Toast.LENGTH_LONG).show(); } } } } 然后,在需要监听该事件的Activity中的onCreate()中注册监听该广播,同时不要忘记在onDestroy()中注销监听该广播: public class TestHeadSetPlugActivity extends Activity { private HeadsetPlugReceiver headsetPlugReceiver; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* register receiver */ registerHeadsetPlugReceiver(); } private void registerHeadsetPlugReceiver() { headsetPlugReceiver = new HeadsetPlugReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.HEADSET_PLUG"); registerReceiver(headsetPlugReceiver, intentFilter); } @Override public void onDestroy() { unregisterReceiver(headsetPlugReceiver); super.onDestroy(); } } 如上这样就可以实现检测耳机插入和拔出了。
G. 三星更新android6.0为什么不显示耳机
1.检查耳机是否插入到底
2.重新插拔耳机尝试
3.重新启动手机
4.是否使用原装耳机,如果不是,请更换原装耳机测试。若问题依旧,建议您将耳机连同手机送至就近的三星服务中心进行检测维修。
H. android 检测耳机是不是插入
int deviceType = device.getBluetoothClass().getMajorDeviceClass(); 不同设备类型该值不同,比如computer蓝牙为256、phone 蓝牙为512、打印机蓝牙为1536等等。
I. 请教android里怎么判断扫描到的蓝牙设备是不是蓝牙耳机
到手机的蓝牙设备列表里面,找到你想确认的蓝牙设备,首先要配对。
配对不成功什么也别提。
配对成功以后,到这个设备的属性里面去看,如果是蓝牙耳机,至少应该包括类似“媒体音频”(不同厂商名字可能略有不同)这样的选项。
如果是可以通话的耳机,应该还具备“手机音频”(不同厂商名字可能略有不同)这样的选项。
J. Android如何判断耳机插入
android系统自带有能捕获耳机插入拔出的ACTION , Intent.ACTION_HEADSET_PLUG。
你写一个广播接收器捕获这个action就可以了,注意区分插入和拔出。