rk3328_音量调节大小音量条不显示

本文详细介绍了在Android系统中解决音量调节时音量条不显示的问题,通过跟踪AudioService.java中的adjustStreamVolume()函数,定位到VolumeDialogControllerImpl.java中的UI更新逻辑,并最终修复了UI不刷新的bug。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇搞定了音量无法调节,但是调节音量的时候音量条不显示,郁闷,全是坑。周末又不得不加班了。。。。

我们已经知道音量调节的具体实现函数是AudioService.java中adjustStreamVolume(),居然音量能调节,那说明设置的音量值能够传递下去,但是发送的消失没有去绘制UI,导致了音量条没有显示,所以,从代码入手,找到发送消息的地方。在adjustStreamVolume()中

 

 

的adjustIndex有个判断,当音量调节时,会把消息发送下去。进入adjustIndex()函数。具体的实现函数为public boolean setIndex(int index, int device, String caller)

 

 

具体看里面的实现,当changed为true时,说明音量值发生了变化,这时,会发送把值传递下去,同时去发消息去绘制UI,EXTRA_VOLUME_STREAM_VALUE为当前值的消息,EXTRA_PREV_VOLUME_STREAM_VALUE为调节前值的消息,EXTRA_VOLUME_STREAM_TYPE_ALIAS为流类型的消息。

所以查找EXTRA_VOLUME_STREAM_VALUE关键字,发现packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java中

 

 

有调用,因为是音量条不显示,肯定跟UI有关系,SystemUI嫌疑最大。

添加打印(在不清楚代码流程的情况下,多添加打印对理解代码流程有很大的帮助)。

 

 

这里的changed为true,会调用函数末尾的

 

 

然后调用

 

启动线程,这里的

 

发现entrySet()的构造实现如下

 

 

看来关键还是W这个类,进入W类,柳暗花明,发现了发消息的函数

 

 

加log发现进入了onVolumeChangedW() case,发现ShouldshowUI(flags),望文生义,很显然了吧

 

对比了8.0的代码

 

 

我曹,差别这么大,8.1的实现更复杂,判断更多。通过与管理sdk的商议,加上box的策略,完美解决!!!!

 

 

总结:遇到问题,以后多加log信息,这点相信程序员都是懂知道;遇到瓶颈时多问老前辈,有时候可能查找方向都是错的,会多做很多无用功。

### RK3326 平台 Android 9.0 音量调节 ADC 配置教程 在 RK3326 平台上实现 Android 9.0音量调节功能涉及多个层面的配置,包括硬件抽象层 (HAL) 和驱动程序的支持。以下是关于如何完成此任务的具体说明。 #### HAL 库支持 为了使音频设备能够正常工作,需要确保 HAL 层已经正确编译并部署到目标设备上。对于 RK3326 而言,其 HAL 文件路径可能类似于 `./out/target/product/rk3326/vendor/lib/hw/audio.primary.rk30board.so`[^1]。如果该文件存在,则需重新构建项目以生成所需的 HAL 库。 将新生成的 HAL 库替换至设备中的对应位置: ```bash adb push audio.primary.rk30board.so /vendor/lib/hw/ ``` #### 设备树配置 音量调节通常依赖于特定的寄存器设置来控制模拟数字转换器 (ADC),这些设置可以通过修改设备树 (Device Tree, DTB) 来完成。具体操作如下: 1. 找到当前使用的设备树源码文件(通常是 `.dts` 文件)。例如,在 RK3326 上可能是 `rk3326-evb.dts`。 2. 添加或调整与 ES7210 或其他声卡芯片相关的节点定义。以下是一个示例片段: ```dts sound { compatible = "simple-audio-card"; simple-audio-card,name = "ES7210 Audio"; /* 定义输入输出端口 */ simple-audio-card,format = "i2s"; simple-audio-card,mclk-fs = <256>; /* 连接 CPU DAI 到 Codec */ simple-audio-card,cpu { sound-dai = <&i2s>; }; simple-audio-card,codec { sound-dai = <&es7210_codec>; // 声卡对应的 codec 名称 }; }; ``` 3. 编译更新后的设备树文件,并将其刷入设备中。 #### 驱动调试与错误排查 当遇到音量调节失败或其他问题时,可以按照以下方法进行排查: - **日志分析** 使用 ADB 工具捕获系统日志,重点关注音频子系统的消息输出: ```bash adb logcat | grep -i audio ``` 如果发现异常提示,比如找到指定的 HAL 模块或者无法初始化某些资源,则表明可能存在未满足的依赖项。 - **权限验证** 确认应用程序具有访问麦克风和扬声器所需的所有必要权限。可以在应用清单文件 (`AndroidManifest.xml`) 中声明如下权限: ```xml <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> ``` - **参数校准** 对于基于 ADC 实现的功能来说,精确设定增益范围至关重要。通过实验确定最佳数值组合后写入固件代码里保存下来供后续调用即可。 --- ### 示例代码:动态改变媒体音量水平 下面给出一段用于演示如何编程方式更改全局音乐播放响度等级的例子: ```java import android.media.AudioManager; public class VolumeController { private AudioManager mAudioMgr; public void adjustVolume(int direction){ mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); if(direction > 0){ mAudioMgr.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); } else{ mAudioMgr.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值