2016-11-19 10 views
0

私は、押したときにオーディオトラックを再生し、もう一度押すとオーディオトラックを停止するボタンがあります。ボタンをクリックすると、アプリケーションが終了します。なぜ私は考えていない。助けてください!ボタンを使ってオーディオトラックを開始し、オーディオトラックを停止するにはどうすればよいですか?

public void Playbutton(View view) { 

      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_IN_MONO, 
         AudioFormat.ENCODING_PCM_16BIT, 
         bufferSizeInBytes, 
         AudioTrack.MODE_STREAM); 

       if (playbuttonstatus){ 
       playBtn.setText(getString(R.string.stop)); 
       audioTrack.play(); 
       audioTrack.write(audioData, 0, bufferSizeInBytes); 
        playbuttonstatus = false;} 
       else{ 
        playBtn.setText(getString(R.string.play)); 
        playbuttonstatus = true; 
        audioTrack.pause(); 
        audioTrack.flush();} 
      } catch (FileNotFoundException e){ 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
+0

アプリケーションが終了したときに表示されるエラーを表示します。 –

+0

多分、例外を最初にキャッチしようとします。どのような種類のエラーが発生しているのかを確認してください。 –

答えて

0

プロジェクトでこのコードを使用してください。私はそれはあなたを助けると思う:

Boolean audiopaused=true; 

    Button play.setOnclickListener(new Onclicklistener){ 
    if (audiopaused){ 
     audio.start(); 
     }esle{ 
     audio.stop(); 
    } 
    } 
0

は今、あなたは関係なく、常にplaybuttonstatusの状態の同じ初期化を実行します。最初にAudioTrackのインスタンスを再生してからもう一度ボタンを押すと、AudioTrackという別の新しいインスタンスが作成され、まだ再生されていなくても停止させてください。おそらくIllegalStateExceptionが発生します。 (そしてまた、あなたがオリジナルのものを停止しない。)

あなたはplayButton()方法外クラスのメンバ変数としてaudioTrackを持つことができます:

private AudioTrack audioTrack; 

と同じように、あなたはあなたのコードを変更することができますAudioTrackが起動および停止されます。

public void playButton(View view) { 

    if (playbuttonstatus){ 
     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 = new AudioTrack(
        AudioManager.STREAM_MUSIC, 
        11025, 
        AudioFormat.CHANNEL_IN_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        bufferSizeInBytes, 
        AudioTrack.MODE_STREAM); 

      playBtn.setText(getString(R.string.stop)); 
      audioTrack.play(); 
      audioTrack.write(audioData, 0, bufferSizeInBytes); 
       playbuttonstatus = false; 

     } catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    else { 
     playBtn.setText(getString(R.string.play)); 
     playbuttonstatus = true; 
     audioTrack.pause(); 
     audioTrack.flush(); 
    } 
} 
+0

ありがとうございます。私は何らかの理由でAudioFormat.CHANNEL_IN_MONOをAudioFormat.CHANNEL_CONFIGURATION_MONOに変更しなければならないことも発見しました。 CHANNEL_CONFIGURATION_MONOに設定すると、廃止予定です。私は何をすべきか考えていますか?これは大きな問題ですか?私はそれがボタンレスポンスの観点から遅れを引き起こすと信じています。 –

+0

'CHANNEL_IN_MONO'は録音用で、' CHANNEL_OUT_MONO'は再生用ですので、廃止された 'CHANNEL_CONFIGURATION_MONO'の代わりに' CHANNEL_OUT_MONO'を使用してください。 –

関連する問題