3

私のアプリケーションでは、オーディオを正常に録音し、次の機能を使用して再生しています。

    public void playfile()
{
    System.out.println("Play Pressed");     
     speechLength = (int)(file.length()/2);
     speech2 = new short[speechLength];
     try
     {
        // Create a DataInputStream to read the audio data back from the saved file.
        InputStream is = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        int i = 0;              
        while(i <  speechLength)
        {
            speech2[i] = dis.readShort();
            i++;
        }

        // Close the input streams.
        is.close();
        bis.close();
        dis.close();  

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                16000, 
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 
                bufferSizeAT, 
                AudioTrack.MODE_STREAM);   

        //Start playback


        runner.start();
        //Updating Progress Bar on UI Thread
        //updateProgressBar();
     } //main try
    catch (Throwable t){} 
}
 Thread runner= new Thread (){
        public void run()
        {

              // Do stuff.
            audioTrack.play();
            audioTrack.setStereoVolume(50, 50);
            audioTrack.write(speech2, 0, speech2.length);

        }
    };

しかし、ボタンをクリックすると、再生中の録音を一時停止したいのですが、再開中は何も起こりません。以下は同じためのコードです:

       final Button p3_button=(Button)myView.findViewById(R.id.btn_play);
    p3_button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {       
            if(p3_button.getText().equals("Pause"))
            {

                p3_button.setText("Resume");
                audioTrack.pause();


            }
            else if(p3_button.getText().equals("Resume"))
            {
                p3_button.setText("Pause");

                audioTrack.play();


            }
            else
            {
                p3_button.setText("Pause");
                count = 0;
                isPlayPressed = true;
                playing = true;
                playfile();
            }
        }});

どんな助けでも素晴らしいでしょう。グーグルでこれについてはあまり助けはありません。私はほとんど私のアプリを使い果たしましたが、今最後の瞬間に私はこの問題に苦しんでいます..助けてください!!

4

2 に答える 2

2

を使用して文字列を比較することはできません==

このような行を に変更p3_button.getText()=="Pause"p3_button.getText().equals("Pause")ます。

問題が解決するかどうか試してください。

于 2012-10-21T18:09:01.523 に答える
2

track.write がブロックされていることが問題であることがわかりました。現在動作しているように見える WavTrack クラスを次に示します。

package org.this_voice.zhongguomozhou;


import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Environment;
import java.io.InputStream;
import java.io.IOException;
import java.lang.Thread;

public class WavTrack {
/**
Make sure you set the sample rate, stereo/mono and encoding
correctly for your audio files.
**/

public static final boolean STOPPED = true;
public AudioTrack at;
public Context mContext;
public int minBufferSize;
public byte[] music = null;
public int size = 0;
public int position = 0;
public InputStream is;
public boolean paused = false;

public WavTrack(Context context) {
    mContext = context;
    minBufferSize = AudioTrack.getMinBufferSize(16000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
    at = new AudioTrack(AudioManager.STREAM_MUSIC, 16000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
        minBufferSize, AudioTrack.MODE_STREAM);
    is = mContext.getResources().openRawResource(R.raw.test01);

    try{
        size = (int)is.available();
    } catch (IOException e) {
        e.printStackTrace();
    }

    at.play();

    new Thread (new Runnable(){
        public void run() {
            int i = 0;
            try{
                music = new byte[512];
                while(((i = is.read(music)) != -1) && !paused){
                    at.write(music, 0, i);
                    position += i;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}


public void pause(){
    is.mark(position);
    paused = true;
    at.pause();
}

public void stop(){
    at.stop();
    at.release();
}

public void play() {
    paused = false;
    try {
        is.reset();
    } catch (IOException e) {
        e.printStackTrace();
    }
    at.play();

    new Thread (new Runnable(){
        public void run() {
            int i = 0;
            try{
                music = new byte[512];
                while(((i = is.read(music)) != -1) && !paused){
                    at.write(music, 0, i);
                    position += i;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}
}
于 2013-05-29T17:39:26.587 に答える