【问题标题】:Android force close Should have subtitle controller already setAndroid force close 应该已经设置了字幕控制器
【发布时间】:2016-09-21 02:06:38
【问题描述】:

我正在 android studio 中创建录音应用。我尝试记录和播放结果,没有问题。但是当我第二次尝试录制时,应用程序强制关闭,LogCat 只给我“E/MediaPlayer:应该已经设置了字幕控制器”

代码如下:

MainActivity.java

package com.zihadrizkyef.belajaraudiocapture;

import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    Button btnPlay, btnStop, btnStart;
    MediaRecorder myAudioRecorder;
    String outputFile = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnPlay = (Button) findViewById(R.id.btnRecordPlay);
        btnStart = (Button) findViewById(R.id.btnRecordStart);
        btnStop = (Button) findViewById(R.id.btnRecordStop);

        btnPlay.setEnabled(false);
        btnStop.setEnabled(false);
        outputFile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/recording.3gpp";

        myAudioRecorder = new MediaRecorder();
        myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        myAudioRecorder.setOutputFile(outputFile);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    myAudioRecorder.prepare();
                    myAudioRecorder.start();
                } catch (IOException | IllegalStateException e) {
                    e.printStackTrace();
                }

                btnStart.setEnabled(false);
                btnStop.setEnabled(true);

                Toast.makeText(MainActivity.this, "Recording started", Toast.LENGTH_SHORT).show();
            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myAudioRecorder.stop();
                myAudioRecorder.release();
                /*myAudioRecorder = null;*/

                btnPlay.setEnabled(true);
                btnStart.setEnabled(true);
                btnStop.setEnabled(false);

                Toast.makeText(MainActivity.this, "Audio recorded successfully", Toast.LENGTH_SHORT).show();
            }
        });

        btnPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mediaPlayer = new MediaPlayer();

                try {
                    mediaPlayer.setDataSource(outputFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    mediaPlayer.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                mediaPlayer.start();
                Toast.makeText(MainActivity.this, "Playing audio", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

【问题讨论】:

标签: java android


【解决方案1】:

请尝试以下代码:

    package com.zihadrizkyef.belajaraudiocapture;

    import android.media.MediaPlayer;
    import android.media.MediaRecorder;
    import android.os.Environment;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;

    import java.io.IOException;

    public class MainActivity extends AppCompatActivity {
        Button btnPlay, btnStop, btnStart;
        MediaRecorder myAudioRecorder;
        String outputFile = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            btnPlay = (Button) findViewById(R.id.btnRecordPlay);
            btnStart = (Button) findViewById(R.id.btnRecordStart);
            btnStop = (Button) findViewById(R.id.btnRecordStop);

            btnPlay.setEnabled(false);
            btnStop.setEnabled(false);


            btnStart.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
outputFile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/recording.3gpp";
    //Creating MediaRecorder and specifying audio source, output format, encoder & output format  
            myAudioRecorder = new MediaRecorder();


            myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
            myAudioRecorder.setOutputFile(outputFile);
                        myAudioRecorder.prepare();
                        myAudioRecorder.start();
                    } catch (IOException | IllegalStateException e) {
                        e.printStackTrace();
                    }

                    btnStart.setEnabled(false);
                    btnStop.setEnabled(true);

                    Toast.makeText(MainActivity.this, "Recording started", Toast.LENGTH_SHORT).show();
                }
            });

            btnStop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    myAudioRecorder.stop();
                    myAudioRecorder.release();
                    /*myAudioRecorder = null;*/

                    btnPlay.setEnabled(true);
                    btnStart.setEnabled(true);
                    btnStop.setEnabled(false);

                    Toast.makeText(MainActivity.this, "Audio recorded successfully", Toast.LENGTH_SHORT).show();
                }
            });

            btnPlay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MediaPlayer mediaPlayer = new MediaPlayer();

                    try {
                        mediaPlayer.setDataSource(outputFile);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    mediaPlayer.start();
                    Toast.makeText(MainActivity.this, "Playing audio", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

在这里我所做的是我创建了 MediaRecorder 并指定了音频源、输出格式......所有这些都为每个开始按钮单击

【讨论】:

  • 谢谢,它有效。但是你能告诉我我犯的错误吗?
  • 问题在于创建 MediaRecorder 并指定音频源、输出格式...您需要为每个会话创建 MediaRecorder 的新对象。
  • 如果我创建具有相同音频源、输出格式等的新 MediaRecorder。旧的 MediaRecorder 是否被删除?
  • 是的,旧的 mediaRecorder 被新的替换了
猜你喜欢
  • 2013-12-08
  • 2014-03-14
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多