MediaRecorder非法状态准备不正确?

时间:2015-07-03 07:48:50

标签: android android-mediarecorder

我正在创建一个Android应用程序来记录我的应用程序中的声音。我不明白为什么它不起作用。我能够做好准备然后开始“工作”或者至少没有崩溃然后我陷入了停止问题()。我重建了我的代码,现在它在start()时遇到了问题。我相信我准备的媒体记录是错误的。

    package com.example.kyle.slap08;

import android.media.AudioManager;
import android.media.MediaRecorder;
import android.media.SoundPool;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;

public class Drum extends AppCompatActivity {
    MediaRecorder rec;
    String mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();

    boolean recording = false;
    boolean loaded =false;
    Button bass;
    Button snare;
    Button kick;
    Button shake;
    Button clap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        rec = new MediaRecorder();
        rec.setAudioSource(MediaRecorder.AudioSource.MIC);
        rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        rec.setOutputFile(mFileName + "track1"); //change to different output files
        try {
            rec.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        final SoundPool sp = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
        final int bassID = sp.load(this, R.raw.deep, 1);
        final int snareID = sp.load(this, R.raw.snare, 1);
        final int kickID = sp.load(this, R.raw.kick, 1);
        final int shakeID = sp.load(this, R.raw.shake, 1);
        final int clapID = sp.load(this, R.raw.clap, 1);
        final int heyID = sp.load(this, R.raw.hey, 1);

        AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
        Float actVolume = (float) am.getStreamVolume(AudioManager.STREAM_MUSIC);
        Float maxVolume = (float) am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        final Float volume = actVolume/maxVolume;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drum);
        sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                loaded = true;

            }
        });
        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);


        bass = (Button) findViewById(R.id.bass);
        snare = (Button) findViewById(R.id.snare);
        kick = (Button) findViewById(R.id.kick);
        shake = (Button) findViewById(R.id.shake);
        clap = (Button) findViewById(R.id.clap);
        Button hey = (Button) findViewById(R.id.hey);
        bass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(bassID, volume, volume, 1, 1, 1f);
            }
        });
        snare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(snareID, volume, volume, 1, 1, 1f);
            }
        });
        kick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(kickID, volume, volume, 1, 1, 1f);
            }
        });
        shake.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(shakeID, volume, volume, 1, 1, 1f);
            }
        });
        clap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(clapID, volume, volume, 1, 1, 1f);

            }
        });
        hey.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(heyID, volume, volume, 1, 1, 1f);
            }
        });
    } //END OF ONCREATE

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_drum, menu);
        return true;
    }

    protected  void recordToggle(){
        if(recording == true){
            recording = false;
            rec.stop();
            //rec.reset();
            //rec.release();
            Toast t = Toast.makeText(getApplicationContext(), "Recoding Off", Toast.LENGTH_SHORT);
            t.show();
        } else {
            recording = true;
            rec.start();
            Toast t = Toast.makeText(getApplicationContext(), "Recoding On", Toast.LENGTH_SHORT);
            t.show();
        }


    }

    protected  void playBack(){

        Toast t = Toast.makeText(getApplicationContext(), "Playback", Toast.LENGTH_SHORT);
        t.show();


    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        switch(id){
            case R.id.action_record:
                recordToggle();
                return true;
            case R.id.action_play:
                playBack();
                return true;

        }
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}//end of activity

1 个答案:

答案 0 :(得分:0)

好吧所以我解决了我的问题,第一件事是stop()故意抛出一个异常所以你必须抓住它:

  try {
                rec.stop();
            } catch (RuntimeException stopException) {
                //handle cleanup here
                Toast t = Toast.makeText(getApplicationContext(), "Recoding Off", Toast.LENGTH_SHORT);
                t.show();
            }

第二,可能是我收到状态无效错误的最大原因是,我的输出文件一点也不正确,所以我评论了它,现在它工作正常! 因此,如果您遇到类似的问题,我建议在google android网站上查看mediarecord的生命周期图表。然后查找如何正确设置输出文件。