首页 > 解决方案 > 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 (最近一次通话最后):

有趣的是,我没有在手机的麦克风权限下找到我的应用程序,这意味着我也无法手动授予权限。该应用程序是否存在一些基本问题?

标签: pythonandroidaudiomicrophonepyjnius

解决方案


如果将来有人面临同样的问题,我找到了答案:在您的规范文件中提及 RECORD_AUDIO 的权限。虽然可以通过代码询问存储权限,但必须在规范文件中提及 MICROPHONE 权限


推荐阅读