如何使用 Android 1.5 录制音频?

Posted

技术标签:

【中文标题】如何使用 Android 1.5 录制音频?【英文标题】:How do I record audio using Android 1.5? 【发布时间】:2010-11-01 00:31:25 【问题描述】:

如何使用 android 录制一些音频?

【问题讨论】:

【参考方案1】:
package com.benmccann.android.hello;

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

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

/**
 * @author <a href="http://www.benmccann.com">Ben McCann</a>
 */
public class AudioRecorder 

  final MediaRecorder recorder = new MediaRecorder();
  final String path;

  /**
   * Creates a new audio recording at the given path (relative to root of SD card).
   */
  public AudioRecorder(String path) 
    this.path = sanitizePath(path);
  

  private String sanitizePath(String path) 
    if (!path.startsWith("/")) 
      path = "/" + path;
    
    if (!path.contains(".")) 
      path += ".3gp";
    
    return Environment.getExternalStorageDirectory().getAbsolutePath() + path;
  

  /**
   * Starts a new recording.
   */
  public void start() 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.");
    

    recorder.setAudiosource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(path);
    recorder.prepare();
    recorder.start();
  

  /**
   * Stops a recording that has been previously started.
   */
  public void stop() throws IOException 
    recorder.stop();
    recorder.release();
  

来自http://www.benmccann.com/dev-blog/android-audio-recording-tutorial/

【讨论】:

【参考方案2】:
package com.training.Recorder2;

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
//import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.IOException;


public class Recorder2 extends Activity

    private static final String LOG_TAG = "AudioRecordTest";
    private static String mFileName = null;

    private RecordButton mRecordButton = null;
    private MediaRecorder mRecorder = null;

    private PlayButton   mPlayButton = null;
    private MediaPlayer   mPlayer = null;

    private void onRecord(boolean start) 
        if (start) 
            startRecording();
         else 
            stopRecording();
        
    

    private void onPlay(boolean start) 
        if (start) 
            startPlaying();
         else 
            stopPlaying();
        
    

    private void startPlaying() 
        mPlayer = new MediaPlayer();
        try 
            mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
         catch (IOException e) 
            Log.e(LOG_TAG, "prepare() failed");
        
    

    private void stopPlaying() 
        mPlayer.release();
        mPlayer = null;
    

    private void startRecording() 
        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();
    

    private void stopRecording() 
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    


    //*******************************************************************************


    class RecordButton extends Button 
        boolean mStartRecording = true;

        OnClickListener clicker = new OnClickListener() 
            public void onClick(View v) 
                onRecord(mStartRecording);
                if (mStartRecording) 
                    setText("Stop recording");
                 else 
                    setText("Start recording");
                
                mStartRecording = !mStartRecording;
            
        ;

        public RecordButton(Context ctx) 
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        
    


  //*******************************************************************************

    class PlayButton extends Button 
        boolean mStartPlaying = true;

        OnClickListener clicker = new OnClickListener() 
            public void onClick(View v) 
                onPlay(mStartPlaying);
                if (mStartPlaying) 

                    setText("Stop playing");
                 else 
                    setText("Start playing");
                
                mStartPlaying = !mStartPlaying;
            
        ;

        public PlayButton(Context ctx) 
            super(ctx);
            setText("Start playing");
            setOnClickListener(clicker);
        
    

    public Recorder2() 
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.3gp";
    

    public void onCreate(Bundle icicle) 
        super.onCreate(icicle);

        LinearLayout ll = new LinearLayout(this);

        mRecordButton = new RecordButton(this);
        ll.addView(mRecordButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));


        mPlayButton = new PlayButton(this);
        ll.addView(mPlayButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        ll.setBackgroundResource(R.drawable.android);

        setContentView(ll);
    

    @Override
    public void onPause() 
        super.onPause();
        if (mRecorder != null) 
            mRecorder.release();
            mRecorder = null;
        

        if (mPlayer != null) 
            mPlayer.release();
            mPlayer = null;
        
    

然后添加到AndroidManifest.xml ---> 这两行 ---> --->

它真的对我有用:)

【讨论】:

这是你需要的两行在 AndroidManifest.xml 中添加【参考方案3】:
final Intent audioIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
            File audioFile = new File(Environment.getExternalStorageDirectory(), "videoTest.mp4");
            audioFileUri = Uri.fromFile(audioFile);
            audioIntent.putExtra(MediaStore.EXTRA_OUTPUT, audioFileUri);
            startActivityForResult(audioIntent, TAKE_AUDIO);

【讨论】:

以上是关于如何使用 Android 1.5 录制音频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中录制音频m4a格式的音频文件?

如何在android中录制音频时做Visualizer

Android 如何使用 MediaRecorder 录制音频并输出为原始 PCM?

如何在android中录制质量更好的音频文件?

Android:如何将录制的音频存储在 SD 卡中

如何使用robolectric对Android音频录制应用进行单元测试