2011-07-26 6 views
1

AudioRecord 클래스를 사용하여 오디오를 녹음하고 있습니다. 자산 파일이나 리소스 폴더의 특정 파일에 오디오를 녹음하고 싶습니다. 녹음에 문제가 없다고 생각합니다. 그러나 버퍼를 읽는 동안 문제가있는 것 같습니다. (그것은 NullPointerException 던지고있다.) 아무도 문제가있을 수 있습니다 제안 할 수 있습니까?AudioRecord 클래스 문제

답변

1

파일을 자산 폴더에 저장할 수 없습니다. 애셋 폴더는 기기의 내부 또는 외부 저장소에 저장해야하므로 대신 읽기 전용입니다.

아래에 미디어 파일을 기록 할 수있는 코어가 있습니다.

package com.example.media.record; 

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

    import android.app.Activity; 
    import android.media.MediaPlayer; 
    import android.media.MediaPlayer.OnCompletionListener; 
    import android.media.MediaPlayer.OnErrorListener; 
    import android.media.MediaRecorder; 
    import android.os.Bundle; 
    import android.os.Environment; 
    import android.os.Handler; 
    import android.os.Handler.Callback; 
    import android.os.Message; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.ProgressBar; 
    import android.widget.Toast; 

    public class MediaRecorderActivity extends Activity implements OnClickListener { 
     Button btnPlay; 
     Button btnRecord; 
     ProgressBar progress; 
     MediaPlayer mPlayer; 
     MediaRecorder mRecorder; 
     String mFileName; 
     boolean mStartRecording = true; 
     boolean mStartPlaying = true; 
     Thread mThreadProgress; 
     int duration = 1; 
     private void onRecord(boolean start) { 
      if(start) { 
       startRecording(); 
      }else { 
       stopRecording(); 
      } 
     } 

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

     private void startRecording() { 
      mRecorder = new MediaRecorder(); 
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      mRecorder.setOutputFile(mFileName); 
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
      mRecorder.setOnErrorListener(errorListenerForRecorder); 

      try { 
       mRecorder.prepare(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       mRecorder.start(); 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), "Error :: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 


     private void stopRecording() { 
      if(mRecorder != null) { 
       mRecorder.stop(); 
       mRecorder.release(); 
       mRecorder = null; 
      } 
     } 

     private void startPlaying() { 
      mPlayer = new MediaPlayer(); 
      try { 
       mPlayer.setDataSource(mFileName); 
       mPlayer.setOnCompletionListener(completionListener); 
       mPlayer.setOnErrorListener(errorListenerForPlayer); 
       mPlayer.prepare(); 
       mPlayer.start(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
     private void stopPlaying() { 
      if(mPlayer != null) { 
       mPlayer.stop(); 
       mPlayer.release(); 
       mPlayer = null; 
      } 
     } 

     OnCompletionListener completionListener = new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       btnRecord.setEnabled(true); 
       btnPlay.setText("Start playing"); 
       mStartPlaying = !mStartPlaying; 
      } 
     }; 

     OnErrorListener errorListenerForPlayer = new OnErrorListener() { 

      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       Toast.makeText(getApplicationContext(), "Error during playing file", 3000).show(); 
       return false; 
      } 
     }; 

     android.media.MediaRecorder.OnErrorListener errorListenerForRecorder = new android.media.MediaRecorder.OnErrorListener() { 

      @Override 
      public void onError(MediaRecorder mr, int what, int extra) { 
       Toast.makeText(getApplicationContext(), "Error during recoding file", 3000).show(); 

      } 
     }; 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      btnPlay = (Button)findViewById(R.id.btnPlay); 
      btnRecord = (Button)findViewById(R.id.btnRecord); 
      progress = (ProgressBar)findViewById(R.id.progressRecorder); 
      mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
      mFileName += "/audiorecordtest.3gp"; 
      File file = new File(mFileName); 
      if(!file.exists()) btnPlay.setEnabled(false); 
      btnPlay.setOnClickListener(this); 
      btnRecord.setOnClickListener(this); 
     } 

     @Override 
     protected void onPause() { 
      super.onPause(); 
      if(mRecorder != null) { 
       mRecorder.stop(); 
      } 
      if(mPlayer != null) { 
       mPlayer.pause(); 
      } 
     } 


     @Override 
     protected void onResume() { 
      super.onResume(); 
      if(mRecorder != null) { 
       mRecorder.start(); 
      } 
      if(mPlayer != null) { 
       mPlayer.start(); 
      } 
     } 

     @Override 
     protected void onStop() { 
      super.onStop(); 
      if(mRecorder != null) { 
       mRecorder.stop(); 
      } 
      if(mPlayer != null) { 
       mPlayer.stop(); 
      } 
     } 

     @Override 
     protected void onDestroy() { 
      super.onDestroy(); 
      if(mRecorder != null) { 
       mRecorder.release(); 
       mRecorder = null; 
      } 
      if(mPlayer != null) { 
       mPlayer.release(); 
       mPlayer = null; 
      } 
     } 

     @Override 
     public void onClick(View v) { 

      if(v == btnPlay) { 

       onPlay(mStartPlaying); 
       if(mStartPlaying) { 
        duration = mPlayer.getDuration(); 
        mThreadProgress = new ThreadProgress(); 
        mThreadProgress.start(); 
        ((Button)v).setText("Stop Playing"); 
        btnRecord.setEnabled(false); 

       } 
       else { 
        ((Button)v).setText("Start Playing"); 
        btnRecord.setEnabled(true); 
        if(mThreadProgress != null && !mThreadProgress.isAlive()) mThreadProgress.stop(); 

        // t.interrupt(); 
       } 
       mStartPlaying = !mStartPlaying; 

      } else if(v == btnRecord) { 
       onRecord(mStartRecording); 
       if(mStartRecording) { 
        mThreadProgress = new ThreadProgress(); 
        mThreadProgress.start(); 
        ((Button)v).setText("Stop Recording"); 
        btnPlay.setEnabled(false); 
        // t.start(); 
       } 
       else { 
        ((Button)v).setText("Start Recording"); 
        btnPlay.setEnabled(true); 
        // t.interrupt(); 
        if(mThreadProgress != null && !mThreadProgress.isAlive()) mThreadProgress.stop(); 
       } 
       mStartRecording = !mStartRecording; 
      } 
     } 


     Handler handler = new Handler(new Callback() { 

      @Override 
      public boolean handleMessage(final Message msg) { 
       if(msg.what == 0) { 
        runOnUiThread(new Runnable() { 
         public void run() { 
          progress.setProgress(msg.arg1); 
         } 
        }); 

       } 
       return false; 
      } 
     }); 

     public class ThreadProgress extends Thread implements Runnable { 

      public int i = 0; 
      @Override 
      public void run() { 
       while((!this.isInterrupted() && mPlayer != null && mPlayer.isPlaying()) || (!this.isInterrupted() && mRecorder != null)) { 
        try { 
         if(duration == 1) i+=1; 
         else i += 100000 /duration; 
         Message message = new Message(); 
         message.what = 0; 
         message.arg1 = i; 
         handler.sendMessage(message); 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }  
       } 
      } 

     } 
    } 

은 어떻게 믿을수 자산이 자산을 같은 폴더 안에 기록 된 파일을 저장할 출력을 설정하는 방법을 말해 줄래 - 고마워 당신이 오디오를 녹음 할 수 있습니다 예를 들어뿐만 아니라 플레이 오디오

You can store recorded file in following places 
1) File directory of your app 
2) External directory(SD card) 
3) Network 
+0

입니다 /record/a.wav.how this 일을 할 수 있습니다. 다음과 같이하지 마십시오 : recorder.setAudioSource (MediaRecorder.AudioSource.DEFAULT); recorder.setOutputFormat (MediaRecorder.OutputFormat.AMR_NB); recorder.setAudioEncoder (MediaRecorder.AudioEncoder.AMR_NB); recordPath = "file : ///android_asset/record/a.wav"; recorder.setOutputFile (recordPath); recorder.prepare(); recorder.start(); –

+0

Asset 폴더는 코드가 – Dharmendra

+0

인 ok.Allright.But로 내부 자산을 저장할 수 없다고 생각합니다. 그러나 리소스 폴더 내부의 원시 폴더에 저장하는 방법은 어떤 생각입니까? –