问题描述
我已经创建了音频播放器。刻录机还具有startRecording按钮和StopRecording按钮,以及PlayRecording和Stop按钮。我注意到,在录制后,单击该录制的文件将不会播放,但是Toast将显示,表明已执行操作。我无法在logcat中检测到任何错误。谢谢您的帮助。
我的程序代码如下:
//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;
}
}
error encountered when i replaced the with the answer you gave me
解决方法
这是您问题的解决方案,您可以查看一下。
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);
}
}
如果您使用的是android 10或更高版本,请不要忘记在清单中添加
android:grantUriPermissions="true"
android:requestLegacyExternalStorage="true"
,
在密切监视和发现之后,我找到了解决方案。 只需将btnStopRecorder设置为启用即可解决问题。
现在,对于任何可能喜欢此代码的人 只需用下面的代码替换 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();
}
}
});