记录和Android上保存音频 [英] recording and saving audio on Android

查看:137
本文介绍了记录和Android上保存音频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发一个Android(2.2)应用程序,录制音频。在code看上去一切正常,甚至保存在SD卡上的文件,但是当我尝试播放音频文件在我的Mac没有任何反应。几乎像文件是空的。我试着保存为MP3播放和.wav,但没有运气。我的code是如下:

 进口的java.io.File;
进口java.io.IOException异常;

进口android.media.MediaRecorder;
进口android.os.Environment;

公共类AudioRecorder {

    私人MediaRecorder记录=新MediaRecorder();

    私人文件OUTFILE = NULL;

    公共AudioRecorder(){}

    公共无效的startRecording(字符串AUDIOFILE)抛出IOException异常{
        字符串状态= android.os.Environment.getExternalStorageState();
        如果(!state.equals(android.os.Environment.MEDIA_MOUNTED)){
            抛出新的IOException异常(SD卡未安装它。+ +的状态。);
        }

        //确保目录,我们计划在用来存放记录
        文件目录=新的文件(路径).getParentFile();
        如果(directory.exists()及!&安培;!directory.mkdirs()){
            抛出新的IOException异常(路径文件无法被创建。);
        }
        尝试{
            文件storageDir =新的文件(环境
                    .getExternalStorageDirectory(),/音频/);
            storageDir.mkdir();
            OUTFILE = File.createTempFile(的AudioFile,.WAV,storageDir);
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
            recorder.setAudioEn codeR(MediaRecorder.AudioEn coder.AMR_NB);
            recorder.setOutputFile(outfile.getAbsolutePath());
        }赶上(IOException异常E){
            e.printStackTrace();
        }

        尝试{
            。录音机prepare();
        }赶上(IllegalStateException异常E){
            e.printStackTrace();
        }

        recorder.start();
        }

    公共无效停止()抛出IOException异常{
        recorder.stop();
        recorder.release();
        }
}
 

我的活动:

  / **
 *录制活动
 * /


进口的java.io.File;
进口java.io.FileOutputStream中;
进口java.io.IOException异常;

进口com.seekika.android.app.helpers.AudioRecorder;

进口android.app.Activity;
进口android.media.MediaRecorder;
进口android.os.Bundle;
进口android.os.Environment;
进口android.os.SystemClock;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.widget.Button;
进口android.widget.Chronometer;

公共类记录延伸活动{

    私有静态最后字符串变量=RecordActivity;

    私人诠释设置= Menu.FIRST;
    私人诠释注销= Menu.FIRST + 1;
    私人诠释EXIT = Menu.FIRST + 2;

    //组件
    私人按钮mBtnStartRecording;
    私人按钮mBtnSto precording;

    私人天文台mChronometer;


    私人字符串audioFileName =;
    最后AudioRecorder记录=新AudioRecorder();

    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.recordstory);
        的initComponents();
    }

    公共无效的initComponents(){
        mChronometer =(天文台)findViewById(R.id.chrono);
        mBtnSto precording =(按钮)findViewById(R.id.btn_stop_recording);
        mBtnSto precording.setEnabled(假);

        mBtnSto precording.setOnClickListener(新View.OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                //停止计时器
                STO precording();
                //停止录音并保存录音文件到SD卡

            }
        });

        mBtnStartRecording =(按钮)findViewById(R.id.btn_start_recording);
        mBtnStartRecording.setOnClickListener(新View.OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                的StartRecording();
                mBtnStartRecording.setEnabled(假);
                mBtnSto precording.setEnabled(真正的);
                //开始录制音频
                //启动定时器

            }
        });

    }

    私人无效的startRecording(){
        mChronometer.setBase(SystemClock.elapsedRealtime());
        mChronometer.start();


        尝试{
            串myRecording =Seekika-+ System.currentTimeMillis的();
            Log.i(TAG,开始录制);
            recorder.startRecording(myRecording);
        }赶上(IOException异常E){
            Log.e(TAG,IOException异常错误);
            e.printStackTrace();
        }

    }

    私人无效STO precording(){
        mChronometer.stop();

        尝试{
            recorder.stop();
        }赶上(IOException异常E){
            e.printStackTrace();
        }

    }


}
 

解决方案

别知道,如果你可以利用这一点,但是这对我的作品:

 公共无效recordAudio(字符串文件名){
    最后MediaRecorder记录=新MediaRecorder();
    ContentValues​​值=新ContentValues​​(3);
    values​​.put(MediaStore.MediaColumns.TITLE,文件名);
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEn codeR(MediaRecorder.AudioEn coder.DEFAULT);
    recorder.setOutputFile(/ SD卡/声音/+文件名);
    尝试 {
      。录音机prepare();
    }赶上(例外五){
        e.printStackTrace();
    }

    最后ProgressDialog mProgressDialog =新ProgressDialog(MyActivity.this);
    mProgressDialog.setTitle(R.string.lbl_recording);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mProgressDialog.setButton(停止录制,新DialogInterface.OnClickListener(){
    公共无效的onClick(DialogInterface对话,诠释whichButton){
        mProgressDialog.dismiss();
        recorder.stop();
        recorder.release();
        }
    });

    mProgressDialog.setOnCancelListener(新DialogInterface.OnCancelListener(){
        公共无效OnCancel的(DialogInterface P1){
            recorder.stop();
            recorder.release();
        }
    });
    recorder.start();
    mProgressDialog.show();
}
 

I'm developing an android (2.2) app to record audio. The code seems to run fine and even saves the files on the SD Card, but when I try and play the audio files on my Mac nothing happens. Almost like the files are empty. I've tried saving them as .mp3 and .wav but no luck. My code is below:

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Environment;

public class AudioRecorder {

    private MediaRecorder recorder = new MediaRecorder();

    private File outfile = null;

    public AudioRecorder(){}

    public void startRecording(String audioFile) throws IOException {
        String state = android.os.Environment.getExternalStorageState();
        if(!state.equals(android.os.Environment.MEDIA_MOUNTED))  {
            throw new IOException("SD Card is not mounted.  It is " + state + ".");
        }

        // make sure the directory we plan to store the recording in exists
        File directory = new File(path).getParentFile();
        if (!directory.exists() && !directory.mkdirs()) {
            throw new IOException("Path to file could not be created.");
        }
        try{
            File storageDir = new File(Environment
                    .getExternalStorageDirectory(), "/audio/");
            storageDir.mkdir();
            outfile=File.createTempFile(audioFile, ".wav",storageDir);
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            recorder.setOutputFile(outfile.getAbsolutePath());
        }catch(IOException e){
            e.printStackTrace();
        }

        try{
            recorder.prepare();
        }catch(IllegalStateException e){
            e.printStackTrace();
        }

        recorder.start();
        }

    public void stop() throws IOException {
        recorder.stop();
        recorder.release();
        }
}

My Activity:

/**
 * Recording Activity
 */


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import com.seekika.android.app.helpers.AudioRecorder;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;

public class Record extends Activity {

    private static final String TAG="RecordActivity";

    private int SETTINGS=Menu.FIRST;
    private int LOGOUT=Menu.FIRST + 1;
    private int EXIT=Menu.FIRST + 2;

    //components
    private Button mBtnStartRecording;
    private Button mBtnStopRecording;

    private Chronometer mChronometer;


    private String audioFileName="";
    final AudioRecorder recorder = new AudioRecorder();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recordstory);
        initComponents();
    }

    public void initComponents(){
        mChronometer=(Chronometer)findViewById(R.id.chrono);
        mBtnStopRecording=(Button)findViewById(R.id.btn_stop_recording);
        mBtnStopRecording.setEnabled(false);

        mBtnStopRecording.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //stop timer
                stopRecording();
                //stop recording and save audio file to SD card

            }
        });

        mBtnStartRecording=(Button)findViewById(R.id.btn_start_recording);
        mBtnStartRecording.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                startRecording();
                mBtnStartRecording.setEnabled(false);
                mBtnStopRecording.setEnabled(true);
                //start recording audio
                //start timer

            }
        });

    }

    private void startRecording(){
        mChronometer.setBase(SystemClock.elapsedRealtime());
        mChronometer.start();


        try{
            String myRecording="Seekika-" + System.currentTimeMillis();
            Log.i(TAG, "Start Recording");
            recorder.startRecording(myRecording);
        }catch(IOException e){
            Log.e(TAG,"IOException error");
            e.printStackTrace();
        }

    }

    private void stopRecording(){
        mChronometer.stop();

        try{
            recorder.stop();
        }catch(IOException e){
            e.printStackTrace();
        }

    }


}

解决方案

Don' know if you can use this, but this works for me:

public void recordAudio(String fileName) {
    final MediaRecorder recorder = new MediaRecorder();
    ContentValues values = new ContentValues(3);
    values.put(MediaStore.MediaColumns.TITLE, fileName);
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    recorder.setOutputFile("/sdcard/sound/" + fileName);
    try {
      recorder.prepare();
    } catch (Exception e){
        e.printStackTrace();
    }

    final ProgressDialog mProgressDialog = new ProgressDialog(MyActivity.this);
    mProgressDialog.setTitle(R.string.lbl_recording);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mProgressDialog.setButton("Stop recording", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        mProgressDialog.dismiss();
        recorder.stop();
        recorder.release();
        }
    });

    mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
        public void onCancel(DialogInterface p1) {
            recorder.stop();
            recorder.release();
        }
    });
    recorder.start();
    mProgressDialog.show();
}

这篇关于记录和Android上保存音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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