Android 录音后,录音机无法播放
我已经创建了音频播放器。录音机具有startRecording按钮和stopRecording按钮以及PlayRecording和Stop按钮。我注意到录制后,单击时录制的文件将不会播放,但Toast将显示,表示执行了某个操作。我无法在logcat中检测到任何错误。谢谢你的帮助 我的程序代码如下:Android 录音后,录音机无法播放,android,audio-recording,Android,Audio Recording,我已经创建了音频播放器。录音机具有startRecording按钮和stopRecording按钮以及PlayRecording和Stop按钮。我注意到录制后,单击时录制的文件将不会播放,但Toast将显示,表示执行了某个操作。我无法在logcat中检测到任何错误。谢谢你的帮助 我的程序代码如下: //Requesting Run-time permission if (!checkPermissionFromDevice()) reque
//Requesting Run-time permission
if (!checkPermissionFromDevice())
requestPermission();
//Init View
btnPlay = (Button)findViewById(R.id.btnPlay);
btnStop = (Button) findViewById(R.id.btnStop);
btnStartRecorder = (Button) findViewById(R.id.startRecord);
btnStopRecorder = (Button) findViewById(R.id.stopRecord);
//implementing the actions
btnStartRecorder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (checkPermissionFromDevice())
{
pathSave = Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/"
+ UUID.randomUUID().toString()+"_audio_record.amr";
setupMediaRecorder();
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
btnPlay.setEnabled(false);
btnStop.setEnabled(false);
Toast.makeText(RecorderActivity.this, "Recording...", Toast.LENGTH_SHORT).show();
}
else {
requestPermission();
}
}
});
btnStopRecorder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaRecorder.stop();
btnStopRecorder.setEnabled(false);
btnPlay.setEnabled(true);
btnStartRecorder.setEnabled(true);
btnStop.setEnabled(false);
Toast.makeText(RecorderActivity.this, "Stop Record...", Toast.LENGTH_SHORT).show();
}
});
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
btnStop.setEnabled(true);
btnStopRecorder.setEnabled(false);
btnStartRecorder.setEnabled(false);
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(pathSave);
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Toast.makeText(RecorderActivity.this, "Playing...", Toast.LENGTH_SHORT).show();
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
btnStopRecorder.setEnabled(false);
btnStartRecorder.setEnabled(true);
btnStop.setEnabled(false);
btnPlay.setEnabled(true);
if (mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
setupMediaRecorder();
Toast.makeText(RecorderActivity.this, "Stop Playing...", Toast.LENGTH_SHORT).show();
}
}
});
}
private void setupMediaRecorder() {
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(pathSave);
}
private void requestPermission() {
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO
}, REQUEST_PERMISSION_CODE);
}
//Press Ctr+O
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 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();
}
}
break;
}
}
private boolean checkPermissionFromDevice() {
int write_external_storage_result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int record_audio_result = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
return write_external_storage_result == PackageManager.PERMISSION_GRANTED &&
record_audio_result == PackageManager.PERMISSION_GRANTED;
}
}
这是您的问题的解决方案,您可以查看
public class RecordAudioActivity extends AppCompatActivity {
Button buttonStart, buttonStop, buttonPlayLastRecordAudio,
buttonStopPlayingRecording, setAudioasMusic ;
File AudioSavePathInDevice;
MediaRecorder mediaRecorder ;
String audioUri;
public static final int RequestPermissionCode = 1;
MediaPlayer mediaPlayer ;
SharedPreferences sharedPref;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPref = getSharedPreferences("musicUri", Context.MODE_PRIVATE);
setContentView(R.layout.activity_record_audio);
buttonStart = (Button) findViewById(R.id.button);
buttonStop = (Button) findViewById(R.id.button2);
buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
buttonStopPlayingRecording = (Button)findViewById(R.id.button4);
setAudioasMusic = (Button)findViewById(R.id.button5);
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonPlayLastRecordAudio.setEnabled(false);
buttonPlayLastRecordAudio.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStopPlayingRecording.setEnabled(false);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
setAudioasMusic.setEnabled(false);
setAudioasMusic.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStart.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
if(checkPermission()) {
AudioSavePathInDevice =
new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/AudioRecording.3gp");
if (Build.VERSION.SDK_INT < 24) {
audioUri = String.valueOf(Uri.fromFile(AudioSavePathInDevice));
} else {
audioUri = String.valueOf(Uri.parse(AudioSavePathInDevice.getPath())); // My work-around for new SDKs, doesn't work in Android 10.
}
MediaRecorderReady();
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
buttonStart.setEnabled(false);
buttonStart.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStop.setEnabled(true);
buttonStop.setTextColor(getResources().getColor(R.color.ef_white));
Toast.makeText(RecordAudioActivity.this, "Recording started",
Toast.LENGTH_LONG).show();
} else {
requestPermission();
}
}
});
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaRecorder.stop();
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonPlayLastRecordAudio.setEnabled(true);
buttonPlayLastRecordAudio.setTextColor(getResources().getColor(R.color.ef_white));
buttonStart.setEnabled(true);
buttonStart.setTextColor(getResources().getColor(R.color.ef_white));
setAudioasMusic.setEnabled(true);
setAudioasMusic.setTextColor(getResources().getColor(R.color.ef_white));
buttonStopPlayingRecording.setEnabled(false);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
Toast.makeText(RecordAudioActivity.this, "Recording Completed",
Toast.LENGTH_LONG).show();
}
});
buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) throws IllegalArgumentException,
SecurityException, IllegalStateException {
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStart.setEnabled(false);
buttonStart.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStopPlayingRecording.setEnabled(true);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_white));
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(String.valueOf(AudioSavePathInDevice));
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Toast.makeText(RecordAudioActivity.this, "Recording Playing",
Toast.LENGTH_LONG).show();
}
});
buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStart.setEnabled(true);
buttonStart.setTextColor(getResources().getColor(R.color.ef_white));
buttonStopPlayingRecording.setEnabled(false);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonPlayLastRecordAudio.setEnabled(true);
buttonPlayLastRecordAudio.setTextColor(getResources().getColor(R.color.ef_white));
setAudioasMusic.setEnabled(true);
setAudioasMusic.setTextColor(getResources().getColor(R.color.ef_white));
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
MediaRecorderReady();
}
}
});
private void requestNewInterstitial() {
mInterstitialAd.loadAd(new AdRequest.Builder().build());
}
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case RequestPermissionCode:
if (grantResults.length> 0) {
boolean StoragePermission = grantResults[0] ==
PackageManager.PERMISSION_GRANTED;
boolean RecordPermission = grantResults[1] ==
PackageManager.PERMISSION_GRANTED;
if (StoragePermission && RecordPermission) {
Toast.makeText(RecordAudioActivity.this, "Permission Granted",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(RecordAudioActivity.this,"Permission " +
"Denied",Toast.LENGTH_LONG).show();
}
}
break;
}
}
public boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(getApplicationContext(),
WRITE_EXTERNAL_STORAGE);
int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
RECORD_AUDIO);
return result == PackageManager.PERMISSION_GRANTED &&
result1 == PackageManager.PERMISSION_GRANTED;
}
private void requestPermission() {
ActivityCompat.requestPermissions(RecordAudioActivity.this, new
String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public void MediaRecorderReady(){
mediaRecorder=new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setOutputFile(AudioSavePathInDevice);
}
这是你的问题的答案,你可以看看
public class RecordAudioActivity extends AppCompatActivity {
Button buttonStart, buttonStop, buttonPlayLastRecordAudio,
buttonStopPlayingRecording, setAudioasMusic ;
File AudioSavePathInDevice;
MediaRecorder mediaRecorder ;
String audioUri;
public static final int RequestPermissionCode = 1;
MediaPlayer mediaPlayer ;
SharedPreferences sharedPref;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPref = getSharedPreferences("musicUri", Context.MODE_PRIVATE);
setContentView(R.layout.activity_record_audio);
buttonStart = (Button) findViewById(R.id.button);
buttonStop = (Button) findViewById(R.id.button2);
buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
buttonStopPlayingRecording = (Button)findViewById(R.id.button4);
setAudioasMusic = (Button)findViewById(R.id.button5);
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonPlayLastRecordAudio.setEnabled(false);
buttonPlayLastRecordAudio.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStopPlayingRecording.setEnabled(false);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
setAudioasMusic.setEnabled(false);
setAudioasMusic.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStart.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
if(checkPermission()) {
AudioSavePathInDevice =
new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/AudioRecording.3gp");
if (Build.VERSION.SDK_INT < 24) {
audioUri = String.valueOf(Uri.fromFile(AudioSavePathInDevice));
} else {
audioUri = String.valueOf(Uri.parse(AudioSavePathInDevice.getPath())); // My work-around for new SDKs, doesn't work in Android 10.
}
MediaRecorderReady();
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
buttonStart.setEnabled(false);
buttonStart.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStop.setEnabled(true);
buttonStop.setTextColor(getResources().getColor(R.color.ef_white));
Toast.makeText(RecordAudioActivity.this, "Recording started",
Toast.LENGTH_LONG).show();
} else {
requestPermission();
}
}
});
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaRecorder.stop();
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonPlayLastRecordAudio.setEnabled(true);
buttonPlayLastRecordAudio.setTextColor(getResources().getColor(R.color.ef_white));
buttonStart.setEnabled(true);
buttonStart.setTextColor(getResources().getColor(R.color.ef_white));
setAudioasMusic.setEnabled(true);
setAudioasMusic.setTextColor(getResources().getColor(R.color.ef_white));
buttonStopPlayingRecording.setEnabled(false);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
Toast.makeText(RecordAudioActivity.this, "Recording Completed",
Toast.LENGTH_LONG).show();
}
});
buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) throws IllegalArgumentException,
SecurityException, IllegalStateException {
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStart.setEnabled(false);
buttonStart.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStopPlayingRecording.setEnabled(true);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_white));
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(String.valueOf(AudioSavePathInDevice));
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Toast.makeText(RecordAudioActivity.this, "Recording Playing",
Toast.LENGTH_LONG).show();
}
});
buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
buttonStop.setEnabled(false);
buttonStop.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonStart.setEnabled(true);
buttonStart.setTextColor(getResources().getColor(R.color.ef_white));
buttonStopPlayingRecording.setEnabled(false);
buttonStopPlayingRecording.setTextColor(getResources().getColor(R.color.ef_black_alpha_50));
buttonPlayLastRecordAudio.setEnabled(true);
buttonPlayLastRecordAudio.setTextColor(getResources().getColor(R.color.ef_white));
setAudioasMusic.setEnabled(true);
setAudioasMusic.setTextColor(getResources().getColor(R.color.ef_white));
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
MediaRecorderReady();
}
}
});
private void requestNewInterstitial() {
mInterstitialAd.loadAd(new AdRequest.Builder().build());
}
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case RequestPermissionCode:
if (grantResults.length> 0) {
boolean StoragePermission = grantResults[0] ==
PackageManager.PERMISSION_GRANTED;
boolean RecordPermission = grantResults[1] ==
PackageManager.PERMISSION_GRANTED;
if (StoragePermission && RecordPermission) {
Toast.makeText(RecordAudioActivity.this, "Permission Granted",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(RecordAudioActivity.this,"Permission " +
"Denied",Toast.LENGTH_LONG).show();
}
}
break;
}
}
public boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(getApplicationContext(),
WRITE_EXTERNAL_STORAGE);
int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
RECORD_AUDIO);
return result == PackageManager.PERMISSION_GRANTED &&
result1 == PackageManager.PERMISSION_GRANTED;
}
private void requestPermission() {
ActivityCompat.requestPermissions(RecordAudioActivity.this, new
String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public void MediaRecorderReady(){
mediaRecorder=new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setOutputFile(AudioSavePathInDevice);
}
经过密切监测和调查,我找到了解决办法。 只需将BTNStoRecorder设置为enabled即可解决此问题 现在,对于任何可能喜欢此代码的人 只需将btnStartRecorder按钮替换为以下代码即可。 我现在很开心
btnStartRecorder.setOnClickListener(new View.OnClickListener() {
@Override*emphasized text*
public void onClick(View view) {
if (checkPermissionFromDevice())
{
pathSave = Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/"
+ UUID.randomUUID().toString()+"_audio_record.amr";
setupMediaRecorder();
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
btnPlay.setEnabled(false);
btnStop.setEnabled(false);
btnStopRecorder.setEnabled(true);
Toast.makeText(RecorderActivity.this, "Recording...", Toast.LENGTH_SHORT).show();
}
else {
requestPermission();
}
}
});
经过密切监测和调查,我找到了解决办法。 只需将BTNStoRecorder设置为enabled即可解决此问题 现在,对于任何可能喜欢此代码的人 只需将btnStartRecorder按钮替换为以下代码即可。 我现在很开心
btnStartRecorder.setOnClickListener(new View.OnClickListener() {
@Override*emphasized text*
public void onClick(View view) {
if (checkPermissionFromDevice())
{
pathSave = Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/"
+ UUID.randomUUID().toString()+"_audio_record.amr";
setupMediaRecorder();
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
btnPlay.setEnabled(false);
btnStop.setEnabled(false);
btnStopRecorder.setEnabled(true);
Toast.makeText(RecorderActivity.this, "Recording...", Toast.LENGTH_SHORT).show();
}
else {
requestPermission();
}
}
});
我用我的代码修复了你的代码,但我无法播放保存在内存中的录制文件。我的代码录制音频,但无法播放。这是我唯一的挑战。但它在我的应用程序中运行。我可以为您提供您尝试过的演示,先生。非常感谢。我刚刚发现了一些我没有添加的内容。你能帮我进行任何循环以保持录制,直到我按stopRecording。如果我执行onBackPressed()以返回第二个活动,记录器将自动停止。我想继续播放,直到我返回Recorder活动并按下stop myself键我用我的代码修复了你的代码,但我无法播放保存在内存中的录制文件。我的代码录制音频,但无法播放。这是我唯一的挑战。但它在我的应用程序中运行。我可以为您提供您尝试过的演示,先生。非常感谢。我刚刚发现了一些我没有添加的内容。你能帮我进行任何循环以保持录制,直到我按stopRecording。如果我执行onBackPressed()以返回第二个活动,记录器将自动停止。我希望它继续,直到我返回RecorderActivity并自己按stop