python - jnius.jnius.JavaException:发生 JVM 异常:setAudioSource 失败
问题描述
由于PyAudio
与android不兼容,尝试jnius
在python中使用以下代码:
if platform == 'android':
from android.permissions import request_permissions, Permission
request_permissions([Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE,
Permission.INTERNET, Permission.RECORD_AUDIO,
Permission.CAPTURE_AUDIO_OUTPUT])
# get the needed Java classes
self.MediaRecorder = autoclass('android.media.MediaRecorder')
self.AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
self.OutputFormat = autoclass('android.media.MediaRecorder$OutputFormat')
self.AudioEncoder = autoclass('android.media.MediaRecorder$AudioEncoder')
#String = autoclass("java.lang.String")
# create out recorder
self.mRecorder = self.MediaRecorder()
self.mRecorder.setAudioSource(self.AudioSource.MIC)
self.mRecorder.setOutputFormat(self.OutputFormat.MPEG_4)
self.mRecorder.setOutputFile('/sdcard/test_recording.mp4')
self.mRecorder.setAudioEncoder(self.AudioEncoder.AMR_NB)
self.mRecorder.prepare()
但是,当应用程序尝试加载时出现异常
jnius.jnius.JavaException: JVM exception occurred: setAudioSource failed
并且应用程序崩溃。从代码中可以看出,我尝试授予所有权限。当应用程序加载时,它会请求媒体权限,而不会请求麦克风权限。
我检查了麦克风的设置,令人惊讶的是,我的应用程序甚至没有列出启用(可能是因为安装源不是 Playstore)。
我该如何克服这个问题?任何帮助表示赞赏。
此外,问题的根本原因是录制音频的权限被拒绝。这发生在我请求 RECORD_AUDIO 权限时。
01-07 14:08:41.497 1417 1834 D CompatibilityInfo: applicationScale - 1.0 01-07 14:08:41.499 2331 2693 I ProcessMonitor: onForegroundInfoChanged: ForegroundInfo{mForegroundPackageName='com.google.android.packageinstaller', mForegroundUid=10023, mForegroundPid =2558, mLastForegroundPackageName='jigyasu.net.voiceasstmob', mLastForegroundUid=10197, mLastForegroundPid=4691, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0} 01-07 14:08:41.499 2331 2693 I GameBoosterService: on : Cur=com.google.android.packageinstaller last=jigyasu.net.voiceasstmob 01-07 14:08:41.499 794 18980 W ServiceManager: 权限失败: android.permission.RECORD_AUDIO from uid=10197 pid=4691 01-07 14: 08:41.500 794 18980 E MediaRecorderService:请求需要 android.permission。RECORD_AUDIO 01-07 14:08:41.500 2331 2693 D GameBoosterService:onGameStatusChange 前景:ForegroundInfo{mForegroundPackageName='com.google.android.packageinstaller',mForegroundUid=10023,mForegroundPid=2558,mLastForegroundPackageName='jigyasu.net.voiceasstmob',mLastForegroundForegroundForegroundForegroundForeground =10197,mLastForegroundPid=4691,mMultiWindowForegroundPackageName='null',mMultiWindowForegroundUid=-1,mFlags=0} 01-07 14:08:41.500 2331 2693 I GameBoosterService:onForegroundInfoChanged:退出 01-07 14:08:41.500 2331 2693 I VideoBox :isSupportVideoBox:假01-07 14:08:41.501 2331 2693 I VideoToolBoxService:onForegroundInfoChanged:退出Vtb 01-07 14:08:41.503 4691 4714 I python:回溯(最近一次通话最后):ForegroundInfo{mForegroundPackageName='com.google.android.packageinstaller', mForegroundUid=10023, mForegroundPid=2558, mLastForegroundPackageName='jigyasu.net.voiceasstmob', mLastForegroundUid=10197, mLastForegroundPid=4691, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1 , mFlags=0} 01-07 14:08:41.500 2331 2693 I GameBoosterService: onForegroundInfoChanged: Exit 01-07 14:08:41.500 2331 2693 I VideoBoxUtils: isSupportVideoBox: false 01-07 14:08:41.501 2331 ToolService: 2693 I Video onForegroundInfoChanged:退出 Vtb 01-07 14:08:41.503 4691 4714 I python:回溯(最近一次通话最后):ForegroundInfo{mForegroundPackageName='com.google.android.packageinstaller', mForegroundUid=10023, mForegroundPid=2558, mLastForegroundPackageName='jigyasu.net.voiceasstmob', mLastForegroundUid=10197, mLastForegroundPid=4691, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1 , mFlags=0} 01-07 14:08:41.500 2331 2693 I GameBoosterService: onForegroundInfoChanged: Exit 01-07 14:08:41.500 2331 2693 I VideoBoxUtils: isSupportVideoBox: false 01-07 14:08:41.501 2331 ToolService: 2693 I Video onForegroundInfoChanged:退出 Vtb 01-07 14:08:41.503 4691 4714 I python:回溯(最近一次通话最后):mLastForegroundPid=4691,mMultiWindowForegroundPackageName='null',mMultiWindowForegroundUid=-1,mFlags=0} 01-07 14:08:41.500 2331 2693 I GameBoosterService:onForegroundInfoChanged:退出 01-07 14:08:41.500 2331 2693 I VideoBoxUtils:是 SupportVideoBox:假 01-07 14:08:41.501 2331 2693 I VideoToolBoxService: onForegroundInfoChanged: Exit Vtb 01-07 14:08:41.503 4691 4714 I python: Traceback (最近一次通话最后):mLastForegroundPid=4691,mMultiWindowForegroundPackageName='null',mMultiWindowForegroundUid=-1,mFlags=0} 01-07 14:08:41.500 2331 2693 I GameBoosterService:onForegroundInfoChanged:退出 01-07 14:08:41.500 2331 2693 I VideoBoxUtils:是 SupportVideoBox:假 01-07 14:08:41.501 2331 2693 I VideoToolBoxService: onForegroundInfoChanged: Exit Vtb 01-07 14:08:41.503 4691 4714 I python: Traceback (最近一次通话最后):
有趣的是,我没有在手机的麦克风权限下找到我的应用程序,这意味着我也无法手动授予权限。该应用程序是否存在一些基本问题?
解决方案
如果将来有人面临同样的问题,我找到了答案:在您的规范文件中提及 RECORD_AUDIO 的权限。虽然可以通过代码询问存储权限,但必须在规范文件中提及 MICROPHONE 权限
推荐阅读
- amazon-web-services - DynamoDB Delete 只是将属性替换为
并保留主键 - javascript - javascript:我想使用javascript根据来自firebase的数据动态添加html标签
- angular - 进行 api 调用后吐司启动不显示
- typescript - TS 4.0 可变元组和中间件模式
- javascript - 提前返回到之前的水平
- reactjs - 使用 React 和 Ant Design Pro / UmiJS 实施 AWS Amplify Authenticator
- powershell - 使用 Powershell 查找子网站所属的网站集
- python - 如何在 python 中将 CSV 表转换为 COCO 格式?
- python-sphinx - Python 代码中注释和文档字符串的基本语法
- groovy - 更新的 groovy 和 spock 导致 propertymissing 和 methodmissing 调用问题