2016-09-22 20 views
1

私はAndroidアプリを開発中です。私のアプリでは、AudioRecordクラスを使ってオーディオを記録する必要があります。 AudioRecordクラスをテストするためのシンプルなアプリケーションを作成します私の簡単なアプリは、ユーザーが "録音"ボタンをクリックして録音を開始するときです。 「停止」をクリックすると、録音を停止します。次に、録音したオーディオを再生するために「再生」ボタンを押します。しかし、私のアプリは私が "レコード"ボタンをクリックするとエラーが出る。AndroidでAudioRecordを使って録音できない

これは私が録音ボタンをクリックしたときに

public class MainActivity extends AppCompatActivity { 

    Boolean recording; 


    private Button btnPlay,btnStop,btnRecord; 
    private String outputFile = null; 
    //outputFile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/recording.3gp"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initialize(); 
     initViews(); 
     setUpViews(); 
    } 

    private void initialize() 
    { 

    } 

    private void initViews() 
    { 
     btnPlay = (Button)findViewById(R.id.btn_play); 
     btnRecord = (Button)findViewById(R.id.btn_record); 
     btnStop = (Button)findViewById(R.id.btn_stop); 
    } 

    private void setUpViews() 
    { 
     btnRecord.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startRecord(); 
      } 
     }); 

     btnStop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       recording = false; 
       Toast.makeText(getBaseContext(),"Stopped",Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     btnPlay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       playRecord(); 
      } 
     }); 
    } 

    private void startRecord(){ 

     File file = new File(Environment.getExternalStorageDirectory(), "test.pcm"); 

     try { 
      file.createNewFile(); 

      OutputStream outputStream = new FileOutputStream(file); 
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); 
      DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream); 

      int minBufferSize = AudioRecord.getMinBufferSize(11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT); 

      short[] audioData = new short[minBufferSize]; 

      AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        minBufferSize); 

      audioRecord.startRecording(); 

      Toast.makeText(getBaseContext(),"Recording",Toast.LENGTH_SHORT).show(); 

      while(recording){ 
       int numberOfShort = audioRecord.read(audioData, 0, minBufferSize); 
       for(int i = 0; i < numberOfShort; i++){ 
        dataOutputStream.writeShort(audioData[i]); 
       } 
      } 

      audioRecord.stop(); 
      dataOutputStream.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    private void playRecord(){ 

     File file = new File(Environment.getExternalStorageDirectory(), "test.pcm"); 

     int shortSizeInBytes = Short.SIZE/Byte.SIZE; 

     int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes); 
     short[] audioData = new short[bufferSizeInBytes]; 

     try { 
      InputStream inputStream = new FileInputStream(file); 
      BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
      DataInputStream dataInputStream = new DataInputStream(bufferedInputStream); 

      int i = 0; 
      while(dataInputStream.available() > 0){ 
       audioData[i] = dataInputStream.readShort(); 
       i++; 
      } 

      dataInputStream.close(); 

      AudioTrack audioTrack = new AudioTrack(
        AudioManager.STREAM_MUSIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        bufferSizeInBytes, 
        AudioTrack.MODE_STREAM); 

      audioTrack.play(); 
      audioTrack.write(audioData, 0, bufferSizeInBytes); 


     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

エラーがスローされます私の活動です。

これはLogcatでエラーです:

enter image description here

エラーとは何ですか? AudioRecordを正しく使用するにはどうしたらいいですか?

答えて

0

最後に私はこの問題を解決しました。私は録音のために新しいスレッドを実行する必要がありました。

private void startRecord(){ 

     File file = new File(Environment.getExternalStorageDirectory(), "test.pcm"); 

     try { 
      file.createNewFile(); 

      OutputStream outputStream = new FileOutputStream(file); 
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); 
      dataOutputStream = new DataOutputStream(bufferedOutputStream); 

      final int minBufferSize = AudioRecord.getMinBufferSize(11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT); 

      audioData = new short[minBufferSize]; 

      final AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        minBufferSize); 

      audioRecord.startRecording(); 

      Toast.makeText(getBaseContext(),"Recording",Toast.LENGTH_SHORT).show(); 


      recordingThread = new Thread(new Runnable() { 
       public void run() { 
        while(recording){ 
         int numberOfShort = audioRecord.read(audioData, 0, minBufferSize); 
         for(int i = 0; i < numberOfShort; i++){ 
          try{ 
           dataOutputStream.writeShort(audioData[i]); 
          } 
          catch (IOException e) 
          { 
           Toast.makeText(getBaseContext(),e.getMessage(),Toast.LENGTH_SHORT).show(); 
          } 
         } 
        } 
       } 
      }, "AudioRecorder Thread"); 

      audioRecord.stop(); 
      dataOutputStream.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
関連する問題