2012-06-20 26 views
8

Chcę nagrywać głos tak długo, jak przytrzymanie przycisku nagrywania i zapisać ten głos w folderze raw w moim projekcie. Użyłem kodu poniżej. Chociaż nie ma błędów, nie mogłem uzyskać żadnego wyniku. Jaki może być problem? Masz jakieś sugestie? Dzięki,Jak mogę nagrać głos w Androidzie tak długo, jak przytrzymać przycisk?

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

Odpowiedz

24

tutaj jest odpowiedź ...

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

plik AppLog.java jest

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 jest

<?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> 

dodać te uprawnienia do pliku manifestu

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

Dzięki za pomoc – selenk

+3

Byłoby lepiej połączyć ze źródłem i wyjaśnić odpowiednie części kodu zamiast wklejania kopii: https://github.com/krvarma/krvarma-android-samples/tree/master/AudioRecorder. 1 –

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

w czasie wykonywania nie można zapisać w formacie RAW Zawartość folderu.

Masz 2 opcje, aby zapisać go w pamięci zewnętrznej (jeśli istnieje) lub w pliku getFileDir, np. W /data/data/package.

+0

Czy mógłbyś wyjaśnić drugą opcję? – selenk

1

MOŻESZ przyjąć pomoc od niniejszego kodeksu

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

Jestem w tym nowy, więc ciężko mi znaleźć moje błędy. Zgaduję jednak, że nie mogę utworzyć pliku. tym razem, kiedy wciskam przycisk nagrywania, oznacza to, że aplikacja niespodziewanie się zatrzymała. – selenk