与Phonegap,我想录制语音,停止录制,并在Android中播放 [英] with Phonegap, I would like to record voice, stop recording, and playing it in Android

查看:123
本文介绍了与Phonegap,我想录制语音,停止录制,并在Android中播放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

HTML文件有4个按钮,可以录制,停止录制语音,播放,停止播放。代码如下所示。

The HTML file has 4 buttons that record, stop recording the voice, and play, stop playing it. the code looks like this.

<!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 Plugin部分为

The Android Plugin part is

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;
    }

}

在Activity中记录,停止录制,播放和停止播放声音。如果我使用phonegap,因为它只是通过插件发送一些字符串, MediaRecorder MediaPlayer 时间。我按下在html的记录按钮,创建 MediaRecorder 对象,但推动停止录制按钮不能停止 MediaRecorder 刚刚创建的对象。对于这个问题,有什么解决方案吗?

The point is, i should stay in an Activity that record, stop recording, play and stop playing the voice. If I use phonegap, since it just send some strings via plugin, the MediaRecorder and MediaPlayer object is created and destroyed each time. I push the record button which is in html, the MediaRecorder object is created, but pushing the stop recording button cannot stop the MediaRecorder object that is just created. Is there any solution for this problem?

推荐答案

使用Phonegap我录制语音和播放录音语音没有额外的插件。
我只能将Phonegap Media的插件转换为我的应用程序,如下所示:

With Phonegap I record voice and play recording voice without addition plugins. I only conect plugin of Phonegap Media to my app like this:

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媒体对象具有以下重要行为, href =http://software.intel.com/en-us/articles/media-sample-using-phonegap#id_android =nofollow> http://software.intel.com/en-us/articles / media-sample-using-phonegap#id_android ):

On Android devices, the PhoneGap media object has the following important behaviors that are not well documented (http://software.intel.com/en-us/articles/media-sample-using-phonegap#id_android):


  • my_audio = new Media('myRecording100.wav', onMediaCallSuccess,
    onMediaCallError):当myRecording100.wav不存在时,
    将创建文件;

  • my_audio.stopRecord():当调用stopRecord()时,.wav

    媒体文件被移动到/ sdcard文件夹。所以当检查以前的
    是否记录了.wav存在,代码应该在/ sdcard文件夹下。如果
    存在,它应该从

    /sdcard/myRecording100.wav打开该文件。

希望这有助于你。

这篇关于与Phonegap,我想录制语音,停止录制,并在Android中播放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆