2012-06-20 26 views
8

Tôi muốn ghi âm giọng nói miễn là giữ nút ghi và lưu giọng nói đó vào thư mục thô trong dự án của tôi. Tôi đã sử dụng mã bên dưới. Gần như không xuất hiện lỗi, tôi không thể nhận được bất kỳ đầu ra nào. Những gì có thể là vấn đề ? Bạn có đề nghị nào không? Cảm ơn,Làm cách nào để ghi âm giọng nói trên Android miễn là giữ nút?

public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 


    Runnable mAction = new Runnable() { 
     public void run() { 
      System.out.println("Performing action..."); 

      int frequency=11025; 
      int channelConfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO; 
      int audioEncoding= AudioFormat.ENCODING_PCM_16BIT; 
      File file=new File(Environment.getExternalStorageDirectory(),"raw.pcm"); 

      try{ 
       file.createNewFile(); 
      }catch(IOException e){} 

      try{ 
       OutputStream os=new FileOutputStream(file); 
       BufferedOutputStream bos=new BufferedOutputStream(os); 
       DataOutputStream dos=new DataOutputStream(bos); 

       int bufferSize=AudioRecord.getMinBufferSize(frequency, channelConfiguration, 
         audioEncoding); 

       short[] buffer=new short[bufferSize]; 
       audioRecorder=new AudioRecord(MediaRecorder.AudioSource.MIC, 
         frequency, channelConfiguration, audioEncoding, bufferSize); 

       audioRecorder.startRecording(); 

       isRecording=true; 

       while(isRecording){ 

        int         bufferReadResult=audioRecorder.read(buffer, 0,bufferSize); 

        for(int i=0;i<bufferReadResult;i++){ 

         dos.writeShort(buffer[i]); 

        } 

       } 

       audioRecorder.stop(); 
       dos.close(); 

      }catch(Throwable t){} 

     } 
    }; 

    switch(event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     if (myHandler != null) return true; 
     myHandler = new Handler(); 
     myHandler.postDelayed(mAction, 500); 
     break; 
    case MotionEvent.ACTION_UP: 

     if (myHandler == null) return true; 


     isRecording=false; 

     myHandler.removeCallbacks(mAction); 
     myHandler = null; 
     break; 
    } 

    return false; 
} 

Trả lời

24

đây là câu trả lời của bạn ...

import java.io.File; 
import java.io.IOException; 
import android.app.Activity; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 

public class AudioOnTouchActivity extends Activity { 
    Button b1; 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 
    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { MediaRecorder.OutputFormat.MPEG_4,    MediaRecorder.OutputFormat.THREE_GPP }; 
    private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP }; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     b1=(Button)findViewById(R.id.button1); 
     b1.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 
       switch(event.getAction()){ 
       case MotionEvent.ACTION_DOWN: 
        AppLog.logString("Start Recording"); 
        startRecording(); 
        break; 
       case MotionEvent.ACTION_UP: 
        AppLog.logString("stop Recording"); 
        stopRecording(); 
        break; 
       } 
       return false; 
      } 
     }); 
    } 

    private String getFilename(){ 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath,AUDIO_RECORDER_FOLDER); 

     if(!file.exists()){ 
      file.mkdirs(); 
     } 

     return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording(){ 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(output_formats[currentFormat]); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(getFilename()); 
     recorder.setOnErrorListener(errorListener); 
     recorder.setOnInfoListener(infoListener); 

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

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() { 
      @Override 
      public void onError(MediaRecorder mr, int what, int extra) { 
       AppLog.logString("Error: " + what + ", " + extra); 
     } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() { 
     @Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
       AppLog.logString("Warning: " + what + ", " + extra); 
     } 
    }; 

    private void stopRecording(){ 
     if(null != recorder){ 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 

      recorder = null; 
     } 
    } 
} 

tập tin AppLog.java là

import android.util.Log; 

public class AppLog { 
private static final String APP_TAG = "AudioRecorder"; 

public static int logString(String message){ 
    return Log.i(APP_TAG,message); 
} 

xml là

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_gravity="center" 
     android:layout_marginTop="10dp"/> 

</LinearLayout> 

Thêm các phép file manifest của bạn

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

Cảm ơn sự giúp đỡ của bạn – selenk

+3

Tốt hơn nên liên kết với nguồn và giải thích các phần liên quan của mã thay vì dán sao chép: https://github.com/krvarma/krvarma-android-samples/tree/master/AudioRecorder. 1 –

1
save that voice into the raw folder in my project. 

Tại thời gian chạy, bạn có thể không lưu nội dung trong thư mục Raw.

Bạn có 2 tùy chọn để lưu trong bộ nhớ ngoài (Nếu có) hoặc trong getFileDir tức là trong thư mục /data/data/package.

+0

Bạn có thể giải thích tùy chọn thứ hai không? – selenk

1

BẠN thể giúp đỡ từ MÃ NÀY

AudioRecorderActivity.java

public class AudioRecorderActivity extends Activity { 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 
    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { 
     MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.OutputFormat.THREE_GPP 
    }; 
    private String file_exts[] = { 
     AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setButtonHandlers(); 
     enableButtons(false); 
     setFormatButtonCaption(); 
    } 

    private void setButtonHandlers() { 
     ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick); 
     ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick); 
     ((Button) findViewById(R.id.btnFormat)).setOnClickListener(btnClick); 
    } 

    private void enableButton(int id, boolean isEnable) { 
     ((Button) findViewById(id)).setEnabled(isEnable); 
    } 

    private void enableButtons(boolean isRecording) { 
     enableButton(R.id.btnStart, !isRecording); 
     enableButton(R.id.btnFormat, !isRecording); 
     enableButton(R.id.btnStop, isRecording); 
    } 

    private void setFormatButtonCaption() { 
     ((Button) findViewById(R.id.btnFormat)).setText(getString(R.string.audio_format) + " (" + file_exts[currentFormat] + ")"); 
    } 

    private String getFilename() { 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath, AUDIO_RECORDER_FOLDER); 

     if (!file.exists()) { 
      file.mkdirs(); 
     } 

     return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording() { 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(output_formats[currentFormat]); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(getFilename()); 
     recorder.setOnErrorListener(errorListener); 
     recorder.setOnInfoListener(infoListener); 

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

    private void stopRecording() { 
     if (null != recorder) { 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 

      recorder = null; 
     } 
    } 

    private void displayFormatDialog() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     String formats[] = { 
      "MPEG 4", "3GPP" 
     }; 

     builder.setTitle(getString(R.string.choose_format_title)).setSingleChoiceItems(formats, currentFormat, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       currentFormat = which; 
       setFormatButtonCaption(); 

       dialog.dismiss(); 
      } 
     }).show(); 
    } 

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {@Override 
     public void onError(MediaRecorder mr, int what, int extra) { 
      AppLog.logString("Error: " + what + ", " + extra); 
     } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {@Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
      AppLog.logString("Warning: " + what + ", " + extra); 
     } 
    }; 

    private View.OnClickListener btnClick = new View.OnClickListener() {@Override 
     public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.btnStart: 
       { 
        AppLog.logString("Start Recording"); 

        enableButtons(true); 
        startRecording(); 

        break; 
       } 
      case R.id.btnStop: 
       { 
        AppLog.logString("Start Recording"); 

        enableButtons(false); 
        stopRecording(); 

        break; 
       } 
      case R.id.btnFormat: 
       { 
        displayFormatDialog(); 

        break; 
       } 
      } 
     } 
    }; 
} 

AppLog.java

import android.util.Log; 

public class AppLog { 
    private static final String APP_TAG = "AudioRecorder"; 

    public static int logString(String message) { 
     return Log.i(APP_TAG, message); 
    } 
}  

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="20dip" > 

    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitCenter" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
     <Button 
      android:id="@+id/btnStart" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="@string/start_recording" /> 
     <Button 
      android:id="@+id/btnStop" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="@string/stop_recording" /> 
     <Button 
      android:id="@+id/btnFormat" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="Format (mp4)" /> 
    </LinearLayout> 

</LinearLayout> 
+0

Tôi mới ở đây, Vì vậy, thật khó cho tôi để tìm lỗi của tôi. Tuy nhiên, tôi đoán tôi không thể tạo tệp. thời gian này khi tôi nhấn nút ghi nó nói rằng ứng dụng dừng đột ngột. – selenk

Các vấn đề liên quan