录音错误

时间:2016-01-02 16:36:11

标签: java android audio record

我是新开发者。 我想通过按住按钮录制声音,我想用媒体播放器类播放。

我的SD卡中有一个文件夹,我录制的所有声音都保存在其中。 当我点击播放按钮时,会播放最后保存的声音文件或修改后的声音。

错误1:当我点击nextbtn时,我的应用程序被强制关闭。

  

java.lang.IllegalStateException               在android.media.MediaPlayer.prepare(本机方法)               在com.example.mehrdad.calendar.Event $ 4.onClick(Event.java:201)               在android.view.View.performClick(View.java:4103)               在android.view.View $ PerformClick.run(View.java:17117)               在android.os.Handler.handleCallback(Handler.java:615)               在android.os.Handler.dispatchMessage(Handler.java:92)               在android.os.Looper.loop(Looper.java:137)               在android.app.ActivityThread.main(ActivityThread.java:4744)               at java.lang.reflect.Method.invokeNative(Native Method)               在java.lang.reflect.Method.invoke(Method.java:511)               在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)               在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)               在dalvik.system.NativeStart.main(本地方法)

错误2:当我释放recordbtn时,我的停止功能未被调用。

这是我在oncreate方法中的代码

             File adr = new File(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]+"/voice");
        File[] files = adr.listFiles();
        if (!(files == null || files.length == 0)) {
            File lastModifiedFile = files[0];
            for (int i = 0; i < files.length; i++) {
                playlist.add(files[i].getAbsolutePath());
                if (lastModifiedFile.lastModified() < files[i].lastModified()) {
                   currentTrack=i;
                    myfile=Uri.parse(playlist.get(currentTrack));
                }
            }
              mp = MediaPlayer.create(Event.this,myfile);
            i=1;

        }

        btnPlay= (Button) findViewById(R.id.play);
        btnPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(i==1) {
                    try {
                        if (mp.isPlaying()) {
                           mp.pause();
                        }
                        mp.start();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if(i==0)
                    Toast.makeText(getApplicationContext(),"No sound to play",Toast.LENGTH_LONG).show();
            }
    });
        btnNextVoice= (Button) findViewById(R.id.nextVoice);
        btnNextVoice.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp.isPlaying()) {
                    mp.stop();
                }
                currentTrack=(currentTrack+1)%playlist.size();
                myfile=Uri.parse(playlist.get(currentTrack));
                mp=MediaPlayer.create(Event.this,myfile);
                try {
                    mp.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }                mp.start();
            }
        });
        btnLastVoice= (Button) findViewById(R.id.lastVoice);
        btnLastVoice.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp.isPlaying()) {
                    mp.stop();
                }
                currentTrack=(currentTrack-1)%playlist.size();
                myfile=Uri.parse(playlist.get(currentTrack));
                try {
                    mp.setDataSource(Event.this,myfile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    mp.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mp.start();
            }
        });
btnStart.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final Date date = new Date();
                final SimpleDateFormat dateFormat = new SimpleDateFormat("HH-mm-ss");
                final File dir;
                Boolean canWrite = Environment.getExternalStorageDirectory().canWrite();
                if (canWrite) {
                    dir = new File(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
                } else {
                    dir = new File(Environment.getRootDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
                }
                dir.mkdirs();
                myRecorder = new MediaRecorder();
                myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
                myRecorder.setOutputFile(String.valueOf(dir) + "/" + dateFormat.format(date) + ".amr");
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:{
                        start();
                        break;
                    }
                    case MotionEvent.ACTION_UP:{
                        stop();
                        break;
                    }
                }
                return false;
            }
        });

stop()和start()函数:

private void stop() {

        myRecorder.stop();
        myRecorder.reset();
        myRecorder.release();
        myRecorder = null;

        Toast.makeText(getApplicationContext(), "Stop recording...",Toast.LENGTH_SHORT).show();
}


private void start() {


    try {
        myRecorder.prepare();
        myRecorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Toast.makeText(getApplicationContext(), "Start recording...",
            Toast.LENGTH_SHORT).show();
}

1 个答案:

答案 0 :(得分:1)

问题1:

您正在已准备好的MediaPlayer上调用prepare()。有关详细信息,请参阅documentation

问题2:

在致电start()之前,您也可以在致电stop()之前创建新的MediaRecorder。您应该将此代码块从onTouch()移到start()

            final Date date = new Date();
            final SimpleDateFormat dateFormat = new SimpleDateFormat("HH-mm-ss");
            final File dir;
            Boolean canWrite = Environment.getExternalStorageDirectory().canWrite();
            if (canWrite) {
                dir = new File(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
            } else {
                dir = new File(Environment.getRootDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
            }
            dir.mkdirs();
            myRecorder = new MediaRecorder();
            myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
            myRecorder.setOutputFile(String.valueOf(dir) + "/" + dateFormat.format(date) + ".amr");
相关问题