Cordova 媒体插件无法录制音频

Cordova media plugin can't record audio

所以我很难尝试用 Cordova Media Plugin 录制音频 我的代码:

    var my_media = new Media("toto.3gp",
          ()=>onSuccess(),
          (err)=>onError(err),
          (status)=>mediaStatus(status)
        );
    console.log(my_media); // Media {id: "07053344-6274-09eb-62ca-d63f099f2a4b", src: "toto.3gp", _duration: -1, _position: -1}
    my_media.startRecord();
    console.log(my_media); // Media {id: "07053344-6274-09eb-62ca-d63f099f2a4b", src: "toto.3gp", _duration: -1, _position: -1}

我确定媒体对象已正确初始化,确实如此。

在 Android 控制台上我得到了这个:

07-10 19:59:20.019 31861-31917/com.phonegap.reacthotloadingtemplate E/MediaRecorder: start failed: -2147483648
07-10 19:59:20.019 31861-31917/com.phonegap.reacthotloadingtemplate E/PluginManager: Uncaught exception from plugin
                                                                                     java.lang.RuntimeException: start failed.
                                                                                         at android.media.MediaRecorder.start(Native Method)
                                                                                         at org.apache.cordova.media.AudioPlayer.startRecording(AudioPlayer.java:160)
                                                                                         at org.apache.cordova.media.AudioHandler.startRecordingAudio(AudioHandler.java:287)
                                                                                         at org.apache.cordova.media.AudioHandler.promptForRecord(AudioHandler.java:543)
                                                                                         at org.apache.cordova.media.AudioHandler.execute(AudioHandler.java:118)
                                                                                         at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:98)
                                                                                         at org.apache.cordova.PluginManager.exec(PluginManager.java:132)
                                                                                         at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:57)
                                                                                         at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
                                                                                         at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
                                                                                         at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                         at android.os.Looper.loop(Looper.java:154)
                                                                                         at android.os.HandlerThread.run(HandlerThread.java:61)

插件正确设置了媒体权限(自动):

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

那么您认为问题是什么?

该错误表明恰好在调用Android MediaRecorder 启动方法时发生错误。我认为 cordova-plugin-media 不支持 3gp 扩展。在插件中,我在源代码中找到了以下注释 (AudioHandler.java):

* Audio formats supported (tested):
*   .mp3, .wav

但如果我没记错的话,我还设法用那个插件录制了 .amr 文件。

当 cordova-media-plugin 开始录制时,它首先创建一个名为 /storage/emulated/0/tmprecording-.3gp 的文件 然后它将该文件重命名为您给它的任何名称而不将其转换为任何其他格式,所以支持 3gp,我意识到我的问题是由于 android sdk 23 及更高版本的权限更改,因此引入了 sdk 23运行时权限。所以我只是将 config.xml 中的 androidTargetSdk 更改为 22,它解决了我的问题。