繁体   English   中英

录音错误

[英]Error in sound recording

我是新开发者。 我想按住一个按钮来录制声音,并想与Mediaplayer类一起播放。

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

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

com.example.mehrdad.calendar.Event $ 4.onClick(Event.java:201)处android.media.MediaPlayer.prepare(本机方法)处的java.lang.IllegalStateException 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) java.lang.reflect.Method.invokeNative(Native方法)处的android.app.ActivityThread.main(ActivityThread.java:4744)处的android.os.Looper.loop(Looper.java:137) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)的Method.invoke(Method.java:511)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)的Method。在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();
}

问题一:

您正在已准备好的MediaPlayer上调用prepare() 请参阅文档以获取更多详细信息。

问题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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM