java - Media Recorder won't start
问题描述
I have been trying to use the Mediarecorder but it doesn't start at all giving me the error given below and when I put the recorder.start in a try and catch the recorder.stop doesn't work giving me a similar error, although I wrote the permission code in the Manifest.xml for Recording.Audio and Write_External_Storage.
public class Recording extends AppCompatActivity {
private MediaRecorder recorder;
private MediaPlayer myPlayer;
private String OUTPUTFILE;
private TextView myCount;
private Button Play;
private Button Next;
private TextView myQuestion;
private int value;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:{
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
// do something
}
else {
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recording);
OUTPUTFILE =
new File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM),
"audiorecorder.3gp")
.getAbsolutePath();
myCount = (TextView) findViewById(R.id.myCount);
Play = (Button) findViewById(R.id.Play);
Next = (Button) findViewById(R.id.Next);
myQuestion = (TextView) findViewById(R.id.myQuestion);
//recorder.start();
if(ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
Toast.makeText(this, "Please grand permission to record audio", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
}
}
else {
value = MainActivity.GenerateValue();
myQuestion.setText(MainActivity.mylist.get(value) + " ./?");
Play.setEnabled(false);
Next.setEnabled(false);
fiveSeconds();
Play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Play.getId() == R.id.Play){
playBack();
Play.setBackground(getResources().getDrawable(R.drawable.pause));
}
else {
stopPlayBack();
Play.setBackground(getResources().getDrawable(R.drawable.play));
}
}
});
Next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent theIntent = new Intent(getApplicationContext(), Make_Notes.class);
startActivity(theIntent);
}
});
}
}
private void fiveSeconds() {
new CountDownTimer(5000, 1000) {
public void onTick(long milliseconds) {
// Log.i("Seconds Left", String.valueOf(milliseconds/1000));
myCount.setText(String.valueOf(milliseconds / 1000));
if (milliseconds / 1000 < 4) {
myCount.setTextColor(Color.RED);
}
}
public void onFinish() {
sixtySeconds();
recorder = new MediaRecorder();
//recorder.reset();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(OUTPUTFILE);
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
Toast.makeText(Recording.this, "Start!", Toast.LENGTH_SHORT).show();
}
}.start();
}
private void sixtySeconds() {
CountDownTimer start = new CountDownTimer(3000, 1000) {
public void onTick(long milliseconds) {
// Log.i("Seconds Left", String.valueOf(milliseconds/1000));
myCount.setText(String.valueOf(milliseconds / 1000));
if (milliseconds / 1000 < 4) {
myCount.setTextColor(Color.RED);
}
}
public void onFinish() {
recorder.stop();
Play.setEnabled(true);
Next.setEnabled(true);
}
}.start();
}
private void stopRecording(){
if(recorder != null){
recorder.stop();
}
else {
Toast.makeText(this, "There is no recorder to play", Toast.LENGTH_SHORT).show();
}
}
private void playBack(){
myPlayer = new MediaPlayer();
try {
myPlayer.setDataSource(OUTPUTFILE);
myPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
myPlayer.start();
}
private void stopPlayBack(){
myPlayer.stop();
Toast.makeText(this, "There is no media to stop", Toast.LENGTH_SHORT).show();
}
}
The Logcat error is:
09-15 15:48:59.183 20615-20615/com.example.abdullah.be_fluent
E/MediaRecorder: start called in an invalid state: 4
09-15 15:48:59.192 20615-20615/com.example.abdullah.be_fluent
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.abdullah.be_fluent, PID: 20615
java.lang.IllegalStateException
at android.media.MediaRecorder._start(Native Method)
at android.media.MediaRecorder.start(MediaRecorder.java:1309)
at com.example.abdullah.be_fluent.Recording$3.onFinish(Recording.java:145) // the Recording.java: 145 is in blue which is myrecorder.start//
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
解决方案
仅在授予权限的情况下尝试设置 MediaRecorder,重构您的代码,如下所示:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// do something
setupMediaRecorder();
fiveSeconds();
} else {
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recording);
OUTPUTFILE = Environment.getExternalStorageDirectory() + "/audiorecorder.m4a";
myCount = (TextView) findViewById(R.id.myCount);
Play = (Button) findViewById(R.id.Play);
Next = (Button) findViewById(R.id.Next);
myQuestion = (TextView) findViewById(R.id.myQuestion);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
Toast.makeText(this, "Please grand permission to record audio", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
}
} else {
myQuestion.setText("MainActivity.mylist.get(value) + ./?");
Play.setEnabled(false);
Next.setEnabled(false);
Play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Play.getId() == R.id.Play) {
playBack();
} else {
stopPlayBack();
}
}
});
Next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent theIntent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(theIntent);
}
});
setupMediaRecorder();
fiveSeconds();
}
}
private void setupMediaRecorder() {
recorder = new MediaRecorder();
recorder.reset();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(OUTPUTFILE);
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
推荐阅读
- docker - Docker 容器在挂载中收到权限被拒绝
- meteor - 用于传递变量的 GraphQL 查询参数语法
- debugging - fmt.Scanln 的调试问题
- python - Boto 出口安全策略
- haskell - Haskell 中的编码和高效 IO
- sql - 数据库设计中的项目编辑请求
- json - 如何在 Oracle 中将 JSON 字符串转换为 JSON
- python - Cplex(Python),model.solution给出的结果与model.print_solution()不同是否正常?
- javascript - 未捕获的类型错误:无法在 resumeVideo 处读取 null 的属性“播放”
- javascript - 如何管理 Cordova FileTransfer 错误上的空返回码?