三星蓝牙耳机怎么监听手机

三星蓝牙耳机怎么监听手机,第1张

蓝牙耳机的使用说明书中都会有相关的详细使用说明,这里拣重点说明一下。除了电源开关,耳机上一般有三个键。如下所示:

它们每个都是多功能键,在不同的情况下有不同的功能。1号键的功能包括:开始播放音乐/停止插入音乐/接听电话/挂断电话;2号键的功能有:增加音量/上一曲;3号键的功能有 减小音量/下一曲。

注:暂不包括通话模式;其它型号蓝牙耳机并不一定完全相同。

2蓝牙耳机上的按键实现原理

试用后会明白,一个按键会有多个功能,那么在Android系统中是如何表示的呢?其实对于Android系统,每次按键只会有一个唯一「键值」响应,使用起来感觉会模模糊糊的,但是其实对于系统来说是很清晰的。

AVRCP全称(Audio/Video Remote Control Profile),是蓝牙协议中的一个profile。从名字上就可以看出主要应用于Audio/Video控制。每个按键并不是独立的,上-曲/下一曲是在正在播放音乐的时候才会有效,即才会向Android发送「键值」。

基于按键从Linux到Android分析具体对于的键值:

Linux扫描码 功能 映射字串 Android键值

00c8 200 开始放音乐 MEDIA_PLAY KEYCODE_MEDIA_PLAY

00c9 201 停止放音乐 MEDIA_PAUSE KEYCODE_MEDIA_PAUSE

00a3 163 下一曲 MEDIA_NEXT KEYCODE_MEDIA_NEXT

00a5 165 上-曲 MEDIA_PREVIOUS KEYCODE_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多媒体开发--资源文件播放》。效果图:

需要说明一点的是,程序带了两个音乐文件在/res/raw中,默认播放的是lapplemp3一个有声音的mp3音乐文件,silence10secmp3是一个无声音的10秒钟音乐文件,实际应用中可以使用它。

问与答

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如果没有得到,那么就使用adb shell getevent来看Linux底层可以不可以得到键值。然后根据按键从Linux到Android来确定Android上层使用的键值码到底是多少。(当然,如果你实在不知道如何监听,把蓝牙耳机寄给我,我给你确定也行。:))

注:其实上述文章完全是根据按键从Linux到Android测试确定下来的。那是篇文章是剥开Android外壳来看「按键」事件的流程的,方法适用于所有输入事件:各种按键/触摸/物理键盘/鼠标等待输入设备。没有一定的Linux开发经验很难看懂和理解。

4 Android后台监听按键怎么实现

或:如何启动一次应用后在后台一直监听播放键 因为有这样一个场景 在用户开车的时候需按一下开关键就启动语音识别的功能。

这个问题其实已经超出了本文讨论的范围,是Android系统对应用层的键盘事件(按键)的分发的问题了。正常情况下,按键只会向当前最端的应用分发键盘事件,也就是说在后台你边音量键都监听不了。

但是既然这种情况(后台应用监听按键)的需求存在,那么就一定有它存在的道理。比如「相机键」,按下后直接调出相机到最前台。从表面上看是相机响应了按键,但是从实现方法上来看,并不是通过键值来 *** 作,必须通过其它方法,比如广播或者其它等等。

明白了其中的道理后,那么想要实现就好办了。先看这个按键有没有广播,如要有接听系统中发出来的广播;如果没有那么对于定制系统可以自己在系统中添加一个广播;总之,正常渠道是没有办法在后台监听一些不应该是你监听到的按键的。

更:查了一下,这个按键是有广播的。这样就可以后台响应了(不需要C/不需要root)。例子我就不试了,见Android官方例子RandomMusicPlayer。

其中的重点是这个广播androidintentactionMEDIA_BUTTON。

20141029更:

本来不想再更新那个Testkey了,好吧,我还是更新了一下,关于后台监听媒体相关按键的方法。没有在界面上更新,通过LogCat查看打印信息。

上述内容算「鱼」,下边把「渔」也提供了:

第一步先直接编译运行RandomMusicPlayer,然后发现确实不能收到广播,然后判断是系统版本问题,有可能是RandomMusicPlayer并没有更新为适合40以上的。在Capture media button on Android >=40 (works on 23)这里找到了问题所在,添加之成功。然后整合到Testkey上,具体改了哪些内容通过Github上的commit id查看。

20150108更:

关于测试程序的源码,是托管在Github上的,文中找到"TestKey"链接,打开后如下图下载:

APK下载

更新源码,添加编译好的APK文件。

直接下载地址:>

adb构成

adb工作原理

获取包名和界面名应用

文件传输

获取app启动时间

命令格式 adb shell am start -w 包名/启动名 或 adb shell am start -W -n package/activity

停止APP应用命令:adb shell am force-stop package

例:启动 comandroidsettings程序并且进入主界面(setttings)

adb shell am start -w comandroidsettings/setttings

获取手机日志

命令格式 adb logcat

例:当程序发生崩溃的时候,可以将日志信息发送给开发,便于迅速定位bug(复制E开头信息到txt)。

关于崩溃的处理,我们需要找日志中的at,前面第一个字符是E的就是错误信息。

3)查看进程列表:adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):

u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Processjava中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

使用 adb shell "dumpsys meminfo -s <pakagename | pid>"命令,输出结果分以下4部分:

PS:在apk内调用运行获取其他app的内存数据则需要root权限

adb命令:adb shell dumpsys gfxinfo <package | pid>

正常情况下帧率应该在1667ms左右,1秒60帧,执行结果如下:

详细计算方法如下:

还有一个命令是: adb shell dumpsys SurfaceFlinger --latency LayerName

其中LayerName在各个不同系统中获取的命令是不一样的

在Android 6系统直接就是SurfaceView

在Android 7系统中可以通过 dumpsys window windows | grep mSurface | grep SurfaceView 然后通过数据截取到

在Android 8系统中可以通过 dumpsys SurfaceFlinger | grep android包名获取到

执行命令结果如下:

计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len-2的第一列数据为end_time,取len-128的第一列数据为start_time

fps = 127/((end_time - start_time) / 10000000)

至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章

老罗的文章SurfaceView原理

Android性能测试之fps获取

至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已

有两种方法可以获取

1) adb shell "top -n 5 | grep <package | pid>" ,第三列就是实时监控的CPU占用率(-n 指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox 的top命令执行,效率会快很多

2) adb shell "dumpsys cpuinfo | grep <package | pid>"

两种方法直接区别在于,top是持续监控状态,而dumpsys cpuinfo获取的实时CPU占用率数据

adb命令:adb shell "dumpsys batterystats < package | pid>" (Android 50后引入)

获取单个应用的耗电量信息,具体返回结果待研究

adb命令:adb shell "dumpsys battery"

出现信息解读:

AC powered:false 是否连接AC(电源)充电线

USB powered:true 是否连接USB(PC或笔记本USB插口)充电

Wireless powered:false 是否使用了无线电源

status: 1 电池状态,2为充电状态,其他为非充电状态

level:58 电量(%)

scale: 100 电量最大数值

voltage: 3977 当前电压(mV)

current now: -335232 当前电流(mA)

temperature:355 电池温度,单位为01摄氏度

adb 命令:adb shell "dumpsys< package | pid> | grep UID" [通过ps命令,获取app的UID(安装后唯一且固定)]

adb shell cat /proc/uid_stat/UID/tcp_rcv [cat为查看命令,读取tcp_rcv获取应用接收流量信息(设备重启后清零)]

adb shell cat /proc/uid_stat/UID/tcp_snd [cat为查看命令,读取tcp_snd获取应用发送流量信息(设备重启后清零)]

计算流量消耗步骤:

或者还有一种方式获取应用流量消耗:

首先判断类型:

cat /sys/class/thermal/thermal_zone/type

只有红框框出来的是有效的

cat /sys/class/thermal/thermal_zone/temp

获取CPU温度

dumpsys battery | grep temperature 单位01摄氏度

获取/proc/stat文件内容(无权限限制)

总的cpu时间片是 total = user+nice+system+idle+iowait+irq+softirq

忙碌时间为 notidle = user+nice+system +iowait+irq+softirq

cpu使用率计算方法为,先取开始的total值和忙碌时间notidle,隔一段时间片,再取一次计算total2,notidle2, cpuuse = (notidle2 – notidle) 100 / (total2 - total)%

PS:由于Android 8权限收紧,在Android 8系统手机内apk内读取文件内容为空,需要shell权限才可获取文件内容,下同

读/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是几核手机,scaling_cur_freq是否存在也不一定,需要判断

至于为啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系统获取的时候,这个文件shell没有读取权限,需要root权限

参考文章: >

1、在命令行中输入“adb shell”

2、进入shell之后,再输入“cat /system/buildprop | grep "product"”

其实,设备信息,主要是存放在“/system/buildprop”文件,通过“cat”命令就可以查看了。

以上就是关于三星蓝牙耳机怎么监听手机全部的内容,包括:三星蓝牙耳机怎么监听手机、Android 常用adb命令、adb构成和工作原理和常用命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9751400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存