在360开测平台中,线上的手机需要对音量进行一个控制,防止一些视频,音乐,游戏的 apk 发出的声音,影响办公环境,但是需要在360开测平台录制视频,音频脚本的需求来讲,我们不能直接控制静音,需要对 apk 进行一个合理的兼容,动态的去设置声音和检测声音。

在 android 开发中,我们可以使用 AudioManager 中调用 setStreamMute 和 getStreamVolume 两个方法来设置和获取当前的音量。但是在Android7.0 版本以上,我们需要动态的去申请免打扰的权限,也就是需要手工介入。

所需要的权限限制:

Manifest.permission.MODIFY_PHONE_STATE </code><code style='border-radius: 0px;white-space: pre;display: flex;font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;'>Manifest.permission.ACCESS_NOTIFICATION_POLICY

这些权限的限制,对脚本来说简直就是灾难。下面我们来看一下 28的源码:(注意我标红的地方, 以 setStreamVolume 源码为例)

我们翻看一下 AudioManager:


参数说明(下面说的参数都是这三个参数)</code>`int streamType  : 就是你设置设置音量的类型,是一个常量, 比如说 AudioManager.STREAM_MUSIC 就是说媒体音量。``int index  : 控制声音的大小,范围不同,有的范围是[0~15], 有的范围 [0~7], 设置的时候可以先查询一下。`<code>int flags  : 设置后有什么变化,比如说 FLAG_PLAY_SOUND 等等...

本质就是获取 IAudioServer 服务,然后调用了 setStreamVolume。

IAudioService

这个类是一个接口类,其中 setStreamVolume, 4个参数(参数越多,反射越困难,并且 u1 包是不包含 context 对象的)

AudioService

既然 IAudioService 是一个接口类,那么,必然有实现这个类的地方,要不然就属于无效代码了。

一些权限控制和最终实现的地方。最终实现的还有另外一个方法,我就不粘贴了,网上基本都能找到。

到这里为止,就会发现,想反射调用难度有点大。那我们直接来看使用 adb 命令来控制声音音量。

在网上都可以找到
https://blog.csdn.net/xcjean/article/details/103091155
这样一篇文章,这篇文章并不是只有 Android 10 才可以使用,它的使用范围是手机版本 >= 8.0 版本就可以使用了。

我们来看一下命令:


adb shell media volume --show --stream 3 --set 1</code>`--stream 后面跟 streamType 这个参数, int 类型`<code>--set 后面跟 index 这个参数的数值, int 类型

在手机版本 < 8.0 版本中,调用这个命令会出错,说没有 volume 这个服务,那低版本的怎么兼容呢?

5.1.0 版本

adb shell service call audio 4 i32 streamType i32 index i32 flags

i32 是int类型的整数,后面跟了设置声音的三个参数。

audio 是系统服务,我们可以执行

adb shell service list

来查看服务,看下图:

那后面跟着 4 怎么解释?

我们把 IAudioService 源码打开,看到 setStreamVolume 是第四个方法,是不是很清楚明白了。

那我们看一下怎么获取当前音量的值:

service call audio 13 i32 streamType

没看错,还是直接看 getStreamVolume 在第几个就可以了。

通过上面的逻辑,我们直接找源码,可以把Android 所有版本都可以这么做:


    </code>`   /**``     * 设置声音``     * @param type``     * @param volume``     * @return``     */``    public String setAudioCMD(int type, int volume){``        String cmd  = "";``        if(Build.VERSION.SDK_INT == 22){``            cmd = String.format("service call audio 4 i32 %d i32 %d i32 0", type, volume);``        }else if(Build.VERSION.SDK_INT &gt;= 23 || Build.VERSION.SDK_INT &lt;= 25){``            cmd = String.format("service call audio 3 i32 %d i32 %d i32 0", type, volume);``        }else if(Build.VERSION.SDK_INT &gt;= 26) {``            cmd = String.format("media volume --show --stream %d --set %d", type, volume);``        }``        return cmd;`<code style='border-radius: 0px;white-space: pre;display: flex;font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;'>    }

   /**</code>`     * 查看手机声音设置是否成功``     * @param type  2 手机铃声  3 手机媒体音量``     * @return``     */``    public String getAudioCMD(int type){``        String cmd  = "";``        if(Build.VERSION.SDK_INT == 22){``            cmd = String.format("service call audio 13 i32 %d", type);``        }else if(Build.VERSION.SDK_INT == 23){``            cmd = String.format("service call audio 9 i32 %d", type);``        }else if(Build.VERSION.SDK_INT == 24 || Build.VERSION.SDK_INT == 25){``            cmd = String.format("service call audio 8 i32 %d", type);``        }else if(Build.VERSION.SDK_INT &gt;= 26) {``            cmd = String.format("media volume --show --stream %d --get", type);``        }``        return cmd;`<code style='border-radius: 0px;white-space: pre;display: flex;font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;'>    }

我们最后来看一下最后的结果输出:


android 版本 &gt;= 8.0</code>` ``    [v] will control stream=2 (STREAM_RING)``    [v] will get volume``    [v] Connecting to AudioService``    [v] volume is 6 in range [0..15]``
``    当前声音是 6, 范围是 [0..15]``
``android 版本 &lt; 8.0``
``    Result: Parcel(00000000 00000009   '........')``    `<code style='border-radius: 0px;white-space: pre;display: flex;font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;'>  当前的声音是 9 , 00000009 是用16进制表示声音的。

参考文献

https://www.androidos.net.cn/sourcecode Android 源码查看的网站,感谢作者的分享

哈喽,喜欢这篇文章的话烦请点个赞哦!万分感谢(*^▽^*)PS:有问题可以联系我们哦v ceshiren001
更多技术文章

使用 adb 对 Android 声音控制全面适配相关推荐

  1. Android声音控制

     AudioManager类位于android.Media 包中,该类提供访问控制音量和钤声模式的操作.通过getSystemService(Context.AUDIO_SERVICE)方法获得A ...

  2. Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程

    前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...

  3. Android 12 adb 串口指令设置耳机音量适配

    1.突然接到测试部一个需求 耳机录音在Android 12 直接运行崩溃,后面抓取日志一看是执行shell指令出现问题,看着日志我也没有特别清晰的思路 2.跳坑 于是我拿了之前另外一台Android ...

  4. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程

    Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...

  5. Android中的声音控制

    先说几个概念,第一个是Audio Stream, Audio Stream可以认为是一个可以单独进行声音控制的通道.music,alarm,notification,电话铃声,系统声音等等都有自己独立 ...

  6. Android 11 变更及适配攻略

    终于开始了Android 11的适配工作.记录一下,供需要的人参考. 1. 准备工作 老规矩,首先将我们项目中的 targetSdkVersion 改为 30.或者使用兼容性调试工具,后面我会说到. ...

  7. Android通知栏介绍与适配总结(上篇)

    此文已由作者黎星授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知 ...

  8. Android通知栏介绍与适配总结

    由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知栏玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更 ...

  9. 美团Android自动化之旅—适配渠道包

    概述 前一篇文章(美团Android自动化之旅-生成渠道包)介绍了Android中几种生成渠道包的方式,基本解决了打包慢的问题. 但是,随着渠道越来越多,不同渠道对应用的要求也不尽相同.例如,有的渠道 ...

最新文章

  1. NVIDIA GPU上的随机数生成
  2. 记一下uiscrollView不响应协议的问题
  3. 微信小程序中换行,空格(多个空格)写法
  4. 【题解】Luogu SP1435 PT07X - Vertex Cover
  5. Boost:额外的bimap的测试程序
  6. ITK:计算网格的平面参数化
  7. 写一个简单控制台启动的mcv服务
  8. operater int()
  9. Java下载文件的几种方式
  10. 移动开发解决方案之玩转输入框
  11. linux内存测试工具memtest,Linux-内存检测利器Memtest86+v1.70
  12. mysql脚本之家_详细讲述MySQL中的子查询操作 (来自脚本之家)
  13. 速卖通开放平台调用菜鸟组件实现云打印
  14. 全网火爆高颜值蓝牙耳机,低延迟游戏党必备蓝牙耳机推荐
  15. Python数据分析与可视化概述
  16. 两条纵坐标折线图绘制
  17. SecureCRT自动登录跳板机/堡垒机直连linux
  18. webservice接口和http接口(API接口)的区别
  19. container_of 和 offsetof 解析
  20. 7.买一件上衣45元,买一件裤子90元,如果成套买的话,一套120.假设我买了m个上衣和n个裤子,问需要花多少钱?

热门文章

  1. UDP数据包协议格式详解
  2. 实现BMP位图色深转换的方法
  3. 计算机病毒的格式是什么样的,文件病毒的格式是什么
  4. 不愁失业!英伟达 CEO 黄仁勋:“AI 让每个人都能成为程序员”
  5. 胖客户端与瘦客户端概念与区别
  6. 【学习总结】MFC(CImagelist)(重绘)(双缓冲)
  7. 智慧监所三维可视化决策系统平台(数字孪生)-解决方案开发案例
  8. Python 的内建函数
  9. 腾讯T9纯手写基于Mycat中间件的分布式数据库架构笔记
  10. Python实现基于物品的协同过滤推荐算法构建电影推荐系统