You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:36:03