2012-07-03 4 views
1

HTML 파일에는 녹음 녹음, 음성 녹음 중지 및 재생, 재생 중지 버튼이 있습니다. 코드는 다음과 같습니다.with 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> 

안드로이드 플러그인 부분은 요점은, 내가 재생 및 음성 재생을 중지 녹음을 중지 액티비티 기록에 남아 있어야입니다

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으로 추가 플러그인없이 음성 녹음 및 녹음 음성 재생. 이 같은 내 애플 리케이션에 폰갭 미디어의 내가 단지를 conect 플러그인 :이

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> 

의 폰갭 미디어 객체를 잘 설명하지 않은 다음과 같은 중요한 행동을 (이 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"파일을 열어야합니다.

희망이 도움이 될 것입니다.

관련 문제