Table of Contents
Plugin concepts
The plugin cordova audio recorder , can be used to record audio , on android and iOS . This plugin , provides an api , which is accessible , using the global object cordova.plugins.audioRecorder
.
The api , consists of two functions , one for performing the recording , and one for stopping it .
For recording , the cordova.plugins.audioRecorder.audioCapture_Start
function , can be used , it has the following signature :
cordova.plugins.audioRecorder.audioCapture_Start(audioCapture_Ended , audioCapture_Failed , audioCapture_duration ) /* audioCapture_duration : Number of seconds to perform audio recording . If non is provided , the default is 60 seconds . audioCapture_Ended : call back function , called when the amount of time allocated for recording , audioCapture_duration , has elapsed . It receives as argument , a String containing the path of the recorded m4a audio file . If cordova.plugins.audioRecorder.audioCapture_Stop is called , while performing recording , then the registered methods , using this function , are not called , instead the registered functions , using cordova.plugins.audioRecorder.audioCapture_Stop are called . audioCapture_Failed : If any error happens during the act of performing the recording , this method is called . It is passed. a String , detailing the error .*/
To stop the recording , it is either stopped automatically , after the set amount of time has elapsed , or it can be stopped at any time , using the cordova.plugins.audioRecorder.audioCapture_Stop
method ,which has the following signature :
cordova.plugins.audioRecorder.audioCapture_Stop(audioCapture_Ended , audioCapture_Failed ) /* audioCapture_Ended : call back function , called when successfully , the audioCapture_Stop function , stopped the recording of the audio file . audioCapture_Ended receives as argument , a String containing the path to the recorded file . audioCapture_Failed : Called when performing the recording has failed . It receives as an argument , a String , detailing the error .*/
The recorded audio file is an m4a
audio file , it is saved in the cache directory , of an application . The cache directory , might be emptied by the system , on low storage . Hence , for permanent storage , the recorded files , must be copied elsewhere .
For iOS , in the config.xml
file , found in the root of the application , the following must be added , in between the widget
element :
<edit-config file="*-Info.plist" mode="merge" target="NSMicrophoneUsageDescription"> <string>Describe why microphone permission is needed</string> </edit-config>
For iOS , also , and to allow recording to continue in the background , you should add UIBackgroundModes
, in the config.xml
file :
<platform name="ios"> ... <config-file parent="UIBackgroundModes" platform="ios" target="*-Info.plist"> <array> <string>audio</string> </array> </config-file> ... </platform>
For android , the plugin can record , even when the application is destroyed , or is running in the background , nothing is to be configured . When the application is recreated after being destroyed , just call the audioCapture_Stop
method , on the deviceready
event , to get the recording that has happened , while the application was destroyed .
Plugin demo
Create an application as follows :
$ cordova create audio-recorder-plugin-demo com.twiserandom.mobileapps.demo.audioRecorderPluginDemo "Audio Recorder Plugin Demo" $ cd audio-recorder-plugin-demo/ $ cordova platform add ios $ cordova platform add android $ cordova plugin add cordova-plugin-audio-recorder
Edit the www/index.html
file to look like this :
<!DOCTYPE html > <html > <head > <meta name="format-detection" content="telephone=no" > <meta name="msapplication-tap-highlight" content="no" > <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" > <title>Audio Recorder Plugin Demo</title> <style > *{ margin: 0px; padding: 0px; } html{ box-sizing: border-box; } html * , html *::before , html *::after{ box-sizing: inherit; } .app_AudioRecorder_Demo{ display: flex; flex-direction: column; } .app_AudioRecorder_Demo button{ font-size : 19px; } .app_AudioRecorder_Demo audio { width : 100%; } </style> </head> <body > <div class="app_AudioRecorder_Demo" > <button id="recordButton" onclick="audioCapture_Start(this )"> Record </button> <button id='stopButton' onclick="audioCapture_Stop(this )"> Stop </button> <audio id="audioPlayer" autoplay controls ></audio> </div> <script type="text/javascript" src="cordova.js"></script> <script> document .addEventListener ('deviceready', onDeviceReady , false ); function onDeviceReady( ){ deviceIsReady = true; recordButton = document .getElementById ('recordButton' ); stopButton = document .getElementById ('stopButton' ); audioPlayer = document .getElementById ('audioPlayer' ); /* For androind , an application might get killed , to get the recording which happned while the application is killed , just call cordova .plugins.audioRecorder .audioCapture_Stop , onDeviceReady . Check beforehand , if the recording time , you have allocated has passed , as not to stop an ongoing recording .*/ if (window .cordova .platformId == 'android'){ audioCapture_Stop( ) }} function audioCapture_Start ( ){ if (deviceIsReady ){ cordova .plugins .audioRecorder .audioCapture_Start( audioCapture_Ended , audioCapture_Failed , 20 ); }} function audioCapture_Stop( ){ if(deviceIsReady ){ cordova .plugins.audioRecorder .audioCapture_Stop( audioCapture_Ended , audioCapture_Failed ); } } function audioCapture_Ended(audioRecording_path ){ audioPlayer .src = audioRecording_path; } function audioCapture_Failed(audioRecording_error ){ console .log (audioRecording_error ); } </script> </body> </html>
Edit the config.xml
file , in the root of the application , to look like this :
<?xml version='1.0' encoding='utf-8'?> <widget id="com.twiserandom.mobileapps.demo.audioRecorderPluginDemo" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> <name>Audio Recorder Plugin Demo</name> <description> A sample Apache Cordova application that responds to the deviceready event. </description> <author email="dev@cordova.apache.org" href="http://cordova.io"> Apache Cordova Team </author> <content src="index.html" /> <access origin="*" /> <allow-intent href="http://*/*" /> <allow-intent href="https://*/*" /> <allow-intent href="tel:*" /> <allow-intent href="sms:*" /> <allow-intent href="mailto:*" /> <allow-intent href="geo:*" /> <platform name="android"> <allow-intent href="market:*" /> </platform> <platform name="ios"> <allow-intent href="itms:*" /> <allow-intent href="itms-apps:*" /> <!-- Optional , allow recording in background for ios --> <config-file parent="UIBackgroundModes" platform="ios" target="*-Info.plist"> <array> <string>audio</string> </array> </config-file> </platform> <edit-config file="*-Info.plist" mode="merge" target="NSMicrophoneUsageDescription"> <string>Describe why microphone permission is needed</string> </edit-config> </widget>
Run the application :
$ cordova emulate ios $ cordova emulate android