java - 录音错误

标签 java android audio record

我是一名新开发人员。 我想通过按住按钮来录制声音,并且我想使用媒体播放器类来播放它。

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

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

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

错误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:

您正在已准备好的 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");

关于java - 录音错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34568127/

相关文章:

java - 让反射在单元测试中工作的问题

Java替换字符串2

android - 在 Firebase 实时数据库上等待的上一个任务需要先完成,然后才能开始新任务

android - 如何删除联系人?

audio - 开源音频模式识别(指纹)

java - 在 Mac OS X 中的命令行上编译 Java 代码

java - 在 clojure REST+disk-I/O 应用程序中要处理哪些错误?

android - 在Android Studio中添加测试方法模板无效?

c# - 如何在 MS WIndows 7 中获取音频设备的插孔信息

language-agnostic - 音高不变的音频