java - 音频文件通过 Java mediarecoder 录制后无法播放
问题描述
我是安卓开发新手。我使用以下代码录制和播放音频,应用程序通过 Java 媒体记录器录制音频,它录制音频但不播放音频。IDE 没有显示任何代码错误,但是当我单击播放按钮时,音频文件没有播放。即媒体播放器不工作。
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.util.UUID;
import static android.os.Environment.getExternalStorageDirectory;
public class rec_ingress extends AppCompatActivity {
private Button btnStopRecording, btnRecord, btnPlay, btnStop;
private String pathSave = "";
private MediaRecorder mediaRecorder;
private MediaPlayer mediaPlayer;
final int REQUEST_PERMISSION_CODE=1000;
@SuppressLint("ShowToast")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rec_ingress);
if(!checkPermissionFromDevice())
requestPermissions();
btnRecord =findViewById(R.id.Recbtn);
btnPlay =findViewById(R.id.playbtn);
btnStopRecording =findViewById(R.id.stopRecbtn);
btnStop =findViewById(R.id.pausebtn);
//runtime Permission Request form android manifest
btnRecord.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if (checkPermissionFromDevice())
{
/* pathSave = Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/"
+UUID.randomUUID().toString()+"_steth19_.mpg";*/
pathSave= getExternalStorageDirectory().getAbsolutePath();
pathSave += "/audiorecordtest.3gp";
setupMediaRecorder();
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(rec_ingress.this,e.getMessage(), Toast.LENGTH_SHORT);
e.getMessage();
}
btnPlay.setEnabled(false);
btnStop.setEnabled(false);
Toast.makeText(rec_ingress.this, "Recording Started", Toast.LENGTH_SHORT).show();
}
}
{
requestPermissions();
}
});
btnStopRecording.setOnClickListener(v -> {
mediaRecorder.stop();
btnStopRecording.setEnabled(false);
btnPlay.setEnabled(true);
btnRecord.setEnabled(true);
btnStop.setEnabled(false);
});
//Play Button
btnPlay.setOnClickListener(v -> {
btnStopRecording.setEnabled(false);
btnStop.setEnabled(true);
btnRecord.setEnabled(true);
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(pathSave);
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Toast.makeText(rec_ingress.this, "Playing....", Toast.LENGTH_SHORT).show();
});
//stop button
btnStop.setOnClickListener(v -> {
btnStopRecording.setEnabled(false);
btnPlay.setEnabled(true);
btnRecord.setEnabled(true);
btnStop.setEnabled(false);
if(mediaPlayer != null)
{
mediaPlayer.stop();
mediaPlayer.release();
setupMediaRecorder();
Toast.makeText(rec_ingress.this, "Stoped....", Toast.LENGTH_SHORT).show();
}
});
}
private void setupMediaRecorder() {
mediaRecorder =new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setOutputFile(pathSave);
}
private boolean checkPermissionFromDevice () {
int write_external_storage_result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int record_audio_results = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
return write_external_storage_result == PackageManager.PERMISSION_GRANTED &&
record_audio_results == PackageManager.PERMISSION_GRANTED;
}
private void requestPermissions() {
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO
}, REQUEST_PERMISSION_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
}
}
解决方案
推荐阅读
- php - PHP脚本安装问题。已遵循页面中给出的所有步骤:https://h-educate.com/publish-php-scripts/
- android - 按下按钮后如何更改应用程序的主题?
- mysql-cli - 用逗号以 CSV 格式导出 Mysql 数据
- sublimetext3 - 比较 Sublime Text 中两个文件的内容,并排视图
- windows - 在 AKS Windows 节点 (prometheus) 上安装软件
- javascript - 对象 POST 表单 HTML 到 Python - 作为字符串发布
- xslt - XSLT:将相同的标签合并为一个并编辑它
- elasticsearch - 多个 Geo_point [Elasticsearch]
- javascript - 如何将渐变填充应用于matter.js中的对象
- azure - 无法理解对网站服务器的 /null GET 请求