java getvolume_java – AudioManager.adjustStreamVolume不再在6台设备上运行

在更新到Android 6.0后,使用AudioManager调整音乐流音量的功能失效,尽管在预6.0设备上正常工作。已尝试多种方法包括使用废弃的setStreamVolume,但仍无法改变音量。

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

所以我遇到一个奇怪的问题,调用AudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_SHOW_UI)不再触发我刚更新到6.0的设备上的系统卷更改.

在所有pre-6设备上,此代码按预期工作.我注意到已经弃用了setStreamVolume的AudioManager的更改,但建议的替代方法是我已经使用的…

起初我认为它可能是一个权限问题,因为MODIFY_AUDIO_SETTINGS被列为危险权限,但我检查了ContextCompat.checkSelfPermission(this,Manifest.Permission.MODIFY_AUDIO_SETTINGS)== PackageManager.PERMISSION_GRANTED(并且也没有音频相关权限设置页面中的权限,所以我假设情况并非如此).

我已经尝试了另一种推荐的方法adjustVolume(AudioManager.ADJUST_LOWER,AudioManager.FLAG_SHOW_UI),但这也没有产生任何结果.

所以,澄清一下:

调用adjustStreamVolume / adjustVolume并且AudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)返回未更改的值,就好像它从未被调用一样.

如果有人对此有任何想法,我真的很想现在就听到它们.

编辑:

自发布以来,我已经切换到使用setStreamVolume(AudioManager.STREAM_MUSIC,value,AudioManager.FLAG_SHOW_UI),即使文档说不再应该使用它.

会喜欢这个想法……

编辑2:

由于我能够在另一台设备上复制,因此打开了an issue

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'E:\Keil5\ARM\ARMCC\Bin' Build target 'Template' compiling main.c... ./deep.h(10): warning: #1-D: last line of file ends without a newline #endif ./adc_key.h(9): warning: #1-D: last line of file ends without a newline void Key_Handler(void); ./vs1053.h(10): warning: #1-D: last line of file ends without a newline uint8_t VS1053_GetVolume(void); main.c(21): warning: #223-D: function "VS1053_Play_Process" declared implicitly VS1053_Play_Process(); main.c(26): warning: #1-D: last line of file ends without a newline } main.c: 5 warnings, 0 errors linking... ..\MOBAN.axf: Error: L6218E: Undefined symbol LCD_Init (referred from main.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol VS1053_Init (referred from main.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol VS1053_Play_Process (referred from main.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol HAL_GetTick (referred from adc_key.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol Play_Next (referred from adc_key.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol Play_Prev (referred from adc_key.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol VS1053_VolumeDown (referred from adc_key.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol LCD_DrawNumber (referred from lcd_menu.o). ..\MOBAN.axf: Error: L6218E: Undefined symbol LCD_DrawString (referred from lcd_menu.o). Not enough information to list image symbols. Not enough information to list load addresses in the image map. Finished: 2 information, 0 warning and 9 error messages. "..\MOBAN.axf" - 9 Error(s), 5 Warning(s). Target not created. Build Time Elapsed: 00:00:02
07-06
<think>我们面对的是两个主要问题: 1. 链接错误:Undefined symbol LCD_Init, VS1053_Init等 2. 编译警告:头文件和源文件缺少换行符 根据引用[1]和[2],我们可以推断: - 链接错误通常是因为函数声明存在但实现未找到(源文件未加入工程或未编译) - 缺少换行符的警告是因为文件末尾没有换行符,这可能导致某些编译器行为不一致,但通常不会影响编译结果。 解决方案: 一、解决链接错误(Undefined symbol) 步骤1:检查源文件是否加入工程 - 在Keil的Project窗口中,检查`lcd_menu.c`(或类似名称的LCD驱动文件)、`vs1053.c`等源文件是否存在于工程中。 - 如果没有,右键点击工程目标(Target)下的文件组(如Source Group 1),选择“Add Existing Files to Group...”,然后添加对应的源文件。 步骤2:检查头文件路径 - 打开Options for Target(Alt+F7)-> C/C++ -> Include Paths - 确保包含了这些驱动头文件所在的目录,例如:`./lcd`, `./vs1053`等。 步骤3:检查函数名称是否一致 - 在头文件中(如`lcd_menu.h`)中声明的函数是`void LCD_Init(void);` - 在源文件中(如`lcd_menu.c`)中实现的函数必须完全一致,注意拼写和参数。 步骤4:检查条件编译 - 有些源文件中的函数实现可能被条件编译指令包围(如`#ifdef USE_LCD`),请确保在头文件包含之前定义了相应的宏(如`#define USE_LCD`)或者在Options for Target的C/C++选项卡的Define中定义。 步骤5:重新编译整个工程 - 执行Project->Clean Target,然后Project->Rebuild all target files。 二、解决缺少换行符的警告 这个警告通常出现在头文件或源文件的末尾没有换行符。解决方法很简单: - 打开提示警告的文件(在警告信息中会给出文件名),将光标定位到文件末尾,按下回车键增加一个空行,然后保存。 注意:每个文件(包括头文件和源文件)都应该以换行符结束,这是C标准的要求(C99标准5.1.1.2节)。虽然大多数编译器不会因此报错,但会给出警告。 三、其他可能的原因 1. 启动文件选择错误:根据引用[1],启动文件需要根据芯片型号选择。例如STM32F103ZET6对应的启动文件是`startup_stm32f103xe.s`。请确保工程中有正确的启动文件。 2. 堆栈设置:在启动文件中,Heap_Size和Stack_Size的设置需要合理。引用[1]中提到将Heap_Size设置为0,因为未使用内存管理函数。如果程序使用了动态内存分配,则需要设置合适的堆大小。 四、关于hex和axf文件 引用[2]中提到,hex和axf文件都是可执行文件格式,但axf文件包含调试信息。在Keil中,默认生成axf文件,也可以生成hex文件(通过配置Output选项卡中的Create HEX File选项)。链接错误会阻止axf文件的生成。 五、Software Packs 引用[3]提到,Keil通过Software Packs来支持新的器件和驱动库。请确保已安装相应的Device Family Pack(例如STM32F1系列)和CMSIS包。 具体步骤: 1. 打开Keil,点击Pack Installer图标(绿色小盒子)。 2. 在Device选项卡中,确保已安装STM32F1系列的DFP(Device Family Pack)。 3. 在CMSIS选项卡中,确保已安装CMSIS Core。 如果缺少,请联网安装。 总结操作流程: 1. 添加缺失的源文件到工程。 2. 添加头文件路径。 3. 检查函数实现是否和声明一致。 4. 检查条件编译宏定义。 5. 为所有源文件和头文件末尾添加换行符。 6. 重新编译整个工程。 如果按照以上步骤操作后问题仍然存在,请检查每个源文件的编译是否成功(在Build Output窗口中查看是否有该源文件的编译信息,以及是否有错误或警告)。 相关问题: 1. 如何正确配置Keil工程以包含自定义驱动文件? 2. Keil中如何设置堆栈大小? 3. 如何解决Keil中的条件编译问题? 4. 为什么需要为文件末尾添加换行符? 5. 如何为STM32项目生成hex文件? 6. Keil的Pack Installer有什么作用?</think>### 解决Keil编译STM32项目链接错误与换行警告的完整指南 #### 一、链接错误核心问题分析 出现`Undefined symbol LCD_Init`、`VS1053_Init`等错误表明: 1. **函数声明存在但实现缺失**:头文件包含函数声明,但链接器找不到对应的实现代码 2. **常见原因**: - 源文件未加入工程(如`lcd.c`、`vs1053.c`缺失) - 头文件路径配置错误 - 条件编译宏未定义 - 启动文件配置不当(参考引用[1]) #### 二、系统解决方案 ##### 步骤1:添加缺失源文件到工程 1. 在Keil中右键点击工程目录 → "Add Existing Files" 2. 添加以下关键源文件: - LCD驱动:`lcd.c`(包含`LCD_Init`实现) - VS1053驱动:`vs1053.c`(包含`VS1053_Init`实现) - ADC按键驱动:`adc_key.c` - BEEP驱动:`beep.c` 3. 验证文件状态: ```mermaid graph LR A[工程文件列表] --> B[lcd.c] A --> C[vs1053.c] A --> D[adc_key.c] A --> E[beep.c] ``` ##### 步骤2:配置头文件路径 1. 打开`Options for Target` → `C/C++`选项卡 2. 在`Include Paths`添加: ``` .\Drivers\LCD .\Drivers\VS1053 .\Drivers\BEEP .\Drivers\ADC_KEY .\Core\Inc ``` 3. 检查头文件包含: ```c // main.c中应包含 #include "lcd.h" #include "vs1053.h" #include "adc_key.h" #include "beep.h" ``` ##### 步骤3:处理条件编译 在`Options for Target` → `C/C++` → `Preprocessor Symbols`添加: ``` USE_LCD USE_VS1053 USE_ADC_KEY USE_BEEP ``` ##### 步骤4:检查启动文件配置 1. 根据引用[1],确认使用正确的启动文件: - STM32F103ZET6 → `startup_stm32f103xe.s` 2. 验证启动文件位置: ``` Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm ``` ##### 步骤5:解决换行警告 1. 打开报警的头文件/源文件 2. 在文件末尾添加空行(按Enter键) 3. 保存文件(确保最后一行是空白行) #### 三、编译验证流程 ```mermaid sequenceDiagram participant 用户 participant Keil participant 编译器 participant 链接器 用户->>Keil: Project > Clean Target 用户->>Keil: Project > Build Target Keil->>编译器: 编译所有.c文件 编译器->>链接器: 生成.o文件 alt 所有符号完整 链接器->>Keil: 生成axf文件[^2] Keil->>用户: 编译成功 else 符号缺失 链接器->>Keil: L6218E错误 Keil->>用户: 显示未定义符号 end ``` #### 四、高级调试技巧 1. **检查.map文件**: - 在`Options for Target` → `Listing`中启用`Linker Listing` - 编译后查看生成的`.map`文件 - 搜索`LCD_Init`确认是否被链接 2. **验证函数签名一致性**: ```c // lcd.h中声明 void LCD_Init(void); // lcd.c中实现 void LCD_Init(void) { // 初始化代码 } ``` 3. **使用Software Packs更新驱动**: - 打开Pack Installer(参考引用[3]) - 安装最新STM32F1系列支持包 - 更新CMSIS和中间件组件 #### 五、相关问题 1. 如何正确配置STM32启动文件中的堆栈大小?[^1] 2. Keil生成的axf文件和hex文件有何区别?[^2] 3. 如何使用Software Packs更新外设驱动?[^3] 4. 为什么C语言要求源文件以换行符结束? 5. 如何解读Keil的map文件定位链接错误? 6. STM32项目中条件编译的最佳实践是什么? > 通过以上步骤,您应该能解决未定义符号错误和换行警告。如果问题仍然存在,请检查: > 1. 所有驱动文件是否包含在编译链中 > 2. 启动文件是否匹配芯片型号 > 3. 是否有拼写错误或大小写不一致问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值