androidcordovacordova-pluginscordova-media-plugin

Cordova media plugin can't record audio


So i have a hard time trying to record audio with Cordova Media Plugin My Code :

    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}

I made sure that the media object is correctly initialized and it is.

on Android console i got this:

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)

Media Permissions are correctly set by the plugin (Automatically):

    <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" />

So what do you think the problem is ?


Solution

  • When cordova-media-plugin starts recording it first creates a file named /storage/emulated/0/tmprecording-.3gp Then it renames that file to whatever name you give it without converting it to any other format, so yeah 3gp is supported, i realised that my issue was due to permissions change from android sdk 23 and above, so sdk 23 introduced runtime permissions. so i just changed androidTargetSdk in my config.xml to 22 and it solved my issue.