Android - Как записать простой звуковой прикус? - PullRequest
0 голосов
/ 22 февраля 2012

РЕДАКТИРОВАТЬ: Когда я нажимаю кнопку записи во второй раз (чтобы остановить запись), он принудительно закрывает приложение. Конкретный код для этого события:

else if(isrec) {
                recorder.stop();
                recorder.reset();
                recorder.release();
                recorder = null;
                isrec = false;
                Toast.makeText( getApplicationContext(),"No longer recording!",Toast.LENGTH_SHORT).show();
            }

(Оригинальный вопрос): У меня проблемы с попыткой заставить приложение записывать звук одним нажатием кнопки. Я включил код ... и вот что говорят мои тосты:

  • после setAudioSource
  • после setOutputFile
  • isrec не соответствует действительности
  • пытается ...
  • поймано исключение ввода-вывода ...

Любая помощь очень ценится.

private OnClickListener micListener = new OnClickListener() {
    boolean isrec = false;
    public void onClick(View v) {
        MediaRecorder recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        Toast.makeText( getApplicationContext(),"after setAudioSource",Toast.LENGTH_SHORT).show();
        recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
        File outputFile = null;
        outputFile = getFileStreamPath("output.amr");
        recorder.setOutputFile(outputFile.getAbsolutePath());

        Toast.makeText( getApplicationContext(),"after setOutputFile",Toast.LENGTH_SHORT).show();
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        if(!isrec) {
            Toast.makeText( getApplicationContext(),"isrec is not true",Toast.LENGTH_SHORT).show();
            try {
                Toast.makeText( getApplicationContext(),"trying...",Toast.LENGTH_SHORT).show();
                recorder.prepare();
                recorder.start();
                isrec = true;
                Toast.makeText( getApplicationContext(),"Recording!",Toast.LENGTH_SHORT).show();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText( getApplicationContext(),"caught IllegalState Exception...",Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText( getApplicationContext(),"caught IO Exception...",Toast.LENGTH_SHORT).show();
            }
        } else if(isrec) {
            recorder.stop();
            recorder.reset();
            recorder.release();
            recorder = null;
            isrec = false;
            Toast.makeText( getApplicationContext(),"No longer recording!",Toast.LENGTH_SHORT).show();
        }
    }
};

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

Может быть это поможет?В статье будет показано, как решить две проблемы:

  1. Показать способ записи файла WAV.
  2. Запись звука с наилучшим качеством.
0 голосов
/ 22 февраля 2012

Попробуйте следующий код для основного действия:

public class AudioRecordTestActivity extends Activity
{
private static final String LOG_TAG = "AudioRecordTest";
private static String mFileName = null;

private RecordButton mRecordButton = null;
private MediaRecorder mRecorder = null;

private PlayButton   mPlayButton = null;
private MediaPlayer   mPlayer = null;

private void onRecord(boolean start) {
    if (start) {
        startRecording();
    } else {
        stopRecording();
    }
}

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

private void startPlaying() {
    mPlayer = new MediaPlayer();
    try {
        mPlayer.setDataSource(mFileName);
        mPlayer.prepare();
        mPlayer.start();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
    }
}

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

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

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
    }

    mRecorder.start();
}

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

class RecordButton extends Button {
    boolean mStartRecording = true;

    OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onRecord(mStartRecording);
            if (mStartRecording) {
                setText("Stop recording");
            } else {
                setText("Start recording");
            }
            mStartRecording = !mStartRecording;
        }
    };

    public RecordButton(Context ctx) {
        super(ctx);
        setText("Start recording");
        setOnClickListener(clicker);
    }
}

class PlayButton extends Button {
    boolean mStartPlaying = true;

    OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onPlay(mStartPlaying);
            if (mStartPlaying) {
                setText("Stop playing");
            } else {
                setText("Start playing");
            }
            mStartPlaying = !mStartPlaying;
        }
    };

    public PlayButton(Context ctx) {
        super(ctx);
        setText("Start playing");
        setOnClickListener(clicker);
    }
}

public AudioRecordTestActivity() {
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    mFileName += "/audiorecordtest.3gp";
}

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    LinearLayout ll = new LinearLayout(this);
    mRecordButton = new RecordButton(this);
    ll.addView(mRecordButton,
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            0));
    mPlayButton = new PlayButton(this);
    ll.addView(mPlayButton,
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            0));
    setContentView(ll);
}

@Override
public void onPause() {
    super.onPause();
    if (mRecorder != null) {
        mRecorder.release();
        mRecorder = null;
    }

    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
}

и в файле манифест укажите следующие разрешения

 <uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
0 голосов
/ 22 февраля 2012

Прежде всего, вы должны использовать логическое для isrec вместо строки

То:

 FileDescriptor fileName = null;
  recorder.setOutputFile(fileName); 

Это означает, что вы хотите записать в файл, который является нулевым

Если вы создаете файл и передаете его в качестве параметра вашего рекордера, он должен работать.

Редактировать : Иногда релиз не работает, когда вы хотите остановить рекордер. Так что просто держите stop() и reset()

...