使用Python实现安卓AudioRecorder录音的报错与优化问题
问题1:time.sleep阻塞UI的替代方案
- 核心原因:Kivy的UI更新和事件响应都运行在主线程,
time.sleep()会阻塞主线程,导致界面无响应。 - 替代方案:使用Kivy自带的
Clock.schedule_once()异步调度延迟任务,不会阻塞主线程。
修改后代码示例:
from kivy.clock import Clock from jnius import autoclass def run(self): self.r = MyRecorder() self.r.mRecorder.prepare() self.r.mRecorder.start() self.console.text += "Recording.." # 1秒后异步执行停止录音逻辑,参数单位为秒 Clock.schedule_once(self.stop_recording, 1) def stop_recording(self, dt): # dt为Clock自动传入的实际延迟时间,无需手动赋值 self.r.mRecorder.stop() self.r.mRecorder.release() self.console.text += "Recording stopped.."
问题2:setAudioSource失败报错排查
该报错主要有三个常见原因,按优先级排查:
原因1:缺少录音权限
安卓系统要求APP必须获取RECORD_AUDIO敏感权限,安卓6.0及以上版本除了在打包配置的manifest中声明权限,还需要在运行时动态申请权限,否则无法调用麦克风。
权限申请代码示例(配套pythonforandroid的android模块使用):
from android.permissions import request_permissions, Permission # 在APP启动阶段或者录音触发前调用权限申请 request_permissions([Permission.RECORD_AUDIO, Permission.WRITE_EXTERNAL_STORAGE])
原因2:输出路径非法
你当前使用的./MYAUDIO.3gp相对路径在安卓环境下没有写入权限,必须指定APP可写的目录,比如应用专属存储目录或者公共音频目录:
import os from android.storage import app_storage_path # 修改MyRecorder中的输出路径配置 self.mRecorder.setOutputFile(os.path.join(app_storage_path(), 'MYAUDIO.3gp'))
原因3:MediaRecorder资源占用
如果上一次录音结束后没有正常调用release()释放资源,会导致麦克风被占用,再次初始化MediaRecorder时就会触发该报错。可以在初始化MyRecorder前先判断是否存在未释放的实例,提前释放资源。
内容的提问来源于stack exchange,提问作者joojn
相关产品推荐
相关产品推荐

