2012-07-03 44 views
1

該HTML文件有4個按鈕,記錄,停止錄製語音,播放,停止播放它。代碼看起來像這樣。與Phonegap,我想錄制語音,停止錄製,並在Android中播放

<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>Cordova</title> 
     <script type="text/javascript" charset="utf-8" src="scripts/cordova-1.9.0.js"></script> 
     <script type="text/javascript" charset="utf-8" src="scripts/jquery-1.7.2.min.js"></script> 

     <script> 
      $(document).ready(function(){ 
       $("#record").on("click", function(){ 
        alert("record start"); 
        window.plugins.VoicePlugin.record(function(){alert("yo");}, 
                function(){alert("yol");}, 
                "voice.3gp"); 
       }); 

       $("#stoprecord").on('click', function(){ 
        alert("record stop"); 
        window.plugins.VoicePlugin.stoprecord(function(){}, 
                 function(){}, 
                 "voice.3pg"); 
       }); 

       $("#play").on("click", function(){ 
        alert("play"); 
        window.plugins.VoicePlugin.play(function(){}, 
          function(){}, 
          "voice.3pg"); 
       }); 

       $("#stopplay").on("click", function(){ 
        alert("stop play"); 
        window.plugins.VoicePlugin.stopplay(function(){}, 
          function(){}, 
          "voice.3pg"); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <button id="record">Start Recording</button> 
     <button id="stoprecord">Stop Recording</button> 
     <button id="play">Start Playing</button> 
     <button id="stopplay">Stop Playing</button> 
    </body> 
</html> 

Android插件部分是

package com.saxoo.voice; 

import java.io.IOException; 

    import org.apache.cordova.api.Plugin; 
    import org.apache.cordova.api.PluginResult; 
    import org.json.JSONArray; 

    import android.media.MediaPlayer; 
    import android.media.MediaRecorder; 
    import android.util.Log; 

/** 
* @author sbapp008 
* 
*/ 
public class VoicePlugin extends Plugin { 

    /* (non-Javadoc) 
    * @see org.apache.cordova.api.Plugin#execute(java.lang.String, org.json.JSONArray, java.lang.String) 
    */ 

    public static final String Record = "record"; 
    public static final String Play = "play"; 
    public static final String Stopplaying = "stopplaying"; 
    public static final String Stoprecording = "stoprecording"; 
    private static final String LOG_TAG = "AudioRecordTest"; 
    private static String mFileName = null; 

    private static MediaRecorder mRecorder = null; 
    private static MediaPlayer mPlayer = null; 

    @Override 
    public PluginResult execute(String action, JSONArray data, String callbackId) { 
     PluginResult result = null; 

     if(Record.equals(action)){ //data에 filename 
      mRecorder = new MediaRecorder(); 
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      mRecorder.setOutputFile(mFileName); 
      mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

      try { 
       mRecorder.prepare(); 
      } catch (IOException e) { 
       Log.e(LOG_TAG, "prepare() failed"); 
      } 

      mRecorder.start(); 

     } else if(Play.equals(action)){ //data에 filename 
      mPlayer = new MediaPlayer(); 

      try { 
       mPlayer.setDataSource(mFileName); 
       mPlayer.prepare(); 
       mPlayer.start(); 
      } catch (IOException e) { 
       Log.e(LOG_TAG, "prepare() failed"); 
      } 
     } else if(Stopplaying.equals(action)){ 
      mPlayer.release(); 
      mPlayer = null; 
     } else{ 
      mRecorder.stop(); 
      mRecorder.release(); 
      mRecorder = null; 
     } 


     return null; 
    } 

} 

的一點是,我應該留在一個活動,記錄,停止錄製,播放和停止播放聲音。如果我使用phonegap,因爲它只是通過插件發送一些字符串,所以每次創建和銷燬對象MediaRecorderMediaPlayer。我按下了html中的記錄按鈕,創建了MediaRecorder對象,但按停止錄製按鈕無法停止剛剛創建的MediaRecorder對象。有沒有解決這個問題的方法?

回答

0

隨着Phonegap我記錄語音和播放錄音語音沒有添加插件。 我唯一的PhoneGap媒體的瞬移插件,以我的應用程序是這樣的:

app/res/xml/config.xml 

<plugin name="Media" value="org.apache.cordova.AudioHandler" /> 

app/AndroidManifest.xml 

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

代碼有:

<!DOCTYPE html> 
<html> 
    <head> 
    <title></title> 

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" /> 
    <meta charset="utf-8"> 

    <script type="text/javascript" charset="utf-8" src="cordova-2.2.0.js"></script> 
    <script type="text/javascript" src="jquery-1.7.2.js"></script> 

    <script type="text/javascript"> 

     var deviceready = false; 
     var mediaVar = null; 
     var recordFileName = "recording.wav"; 
     function onBodyLoad() 
     {   
      document.addEventListener("deviceready", onDeviceReady, false); 
      deviceready = true; 
     } 

     $(document).ready(function(){ 

      //validation to check if device is ready is skipped 

      $("#recordBtn").click(function(){ 
       record();     
      }); 

      $("#playBtn").click(function(){ 
       play(); 
      }); 

      $("#stopBtn").click(function(){ 
       stop(); 
      }); 
     }); 

     function record() 
     { 
     if (mediaVar != null) { 
       mediaVar.release(); 
      } 
      createMedia(function(){ 
       status = "recording"; 
       mediaVar.startRecord(); 
      },onStatusChange); 
     } 

     function createMedia(onMediaCreated, mediaStatusCallback){ 
      if (mediaVar != null) { 
       onMediaCreated(); 
       return; 
      } 

      if (typeof mediaStatusCallback == 'undefined') 
       mediaStatusCallback = null; 

       mediaVar = new Media(recordFileName, function(){ 
        log("Media created successfully"); 
       }, onError, mediaStatusCallback); 
       onMediaCreated(); 
     } 

     function stop() 
     { 
      if (mediaVar == null) 
       return; 

      if (status == 'recording') 
      { 
       mediaVar.stopRecord(); 
       log("Recording stopped"); 
      } 
      else if (status == 'playing') 
      { 
       mediaVar.stop();    
       log("Play stopped"); 
      } 
      else 
      { 
       log("Nothing stopped"); 
      } 
      status = 'stopped'; 
     } 

     function play() 
     { 
      createMedia(function(){ 
       status = "playing"; 
      mediaVar = new Media('/sdcard/'+recordFileName, function(){ 
        log("Media created successfully"); 
       }, onError); 

       mediaVar.play();  
      }); 
     } 

     function onStatusChange() 
     { 
     } 

     function onSuccess() 
     { 
      //do nothing 
     } 

     function onError(err) 
     { 
      if (typeof err.message != 'undefined') 
       err = err.message; 
      alert("Error : " + err); 
     } 

     function log(message) 
     { 
      console.info(message); 
     } 
</script> 
    </head> 
    <body onload="onBodyLoad()"> 
     Recorder<br> 
     <input type="button" name="recordBtn" id="recordBtn" value="Record"> 
     <input type="button" name="stopBtn" id="stopBtn" value="Stop"> 
     <input type="button" name="playBtn" id="playBtn" value="Play"> 
    </body> 
</html> 

在Android設備上的PhoneGap的媒體對象有沒有得到很好的記錄了以下重要的行爲( http://software.intel.com/en-us/articles/media-sample-using-phonegap#id_android):

  • 「my_audio =新媒體( 'myRecording100.wav',onMediaCallSuccess, onMediaCallError)」:當「myRecording10 0.wav「不存在,它會創建該文件; 將創建該文件;當它存在時,它打開它。
  • 「my_audio.stopRecord()」:當調用「stopRecord()」時,媒體文件的.wav
    被移動到「/ sdcard」文件夾。因此,在檢查是否存在以前的 .wav時,代碼應位於「/ sdcard」文件夾下。如果 它確實存在,它應該從
    「/sdcard/myRecording100.wav」打開文件。

希望這可以幫助你。