Mediarecorder不工作Android Studio Java,继续遇到错误
嗨,我希望有人可以帮助我,我正在构建一个具有录音功能的应用程序,我试图根据教程构建一个演示媒体录音机应用程序,但我一直面临问题,我拥有录制,读/写入/写作的权限在清单中存储,但是当我尝试录制或停止录制时,我的应用程序会崩溃。
这是我的java代码
public class UploadAudio extends AppCompatActivity {
private Button recordAudio, recordStop;
private TextView recordLabel;
private MediaRecorder recorder;
private String fileName = null;
private static final String LOG_TAG = "Record Log";
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
// Requesting permission to RECORD_AUDIO
private boolean permissionToRecordAccepted = false;
private String [] permissions = {Manifest.permission.RECORD_AUDIO};
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case REQUEST_RECORD_AUDIO_PERMISSION:
permissionToRecordAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
break;
}
if (!permissionToRecordAccepted ) finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload_audio);
ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);
recordAudio = findViewById(R.id.record_button);
recordStop = findViewById(R.id.record_stop);
recordLabel = findViewById(R.id.record_label);
fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
fileName += "/recorded_audio.3gp";
recordAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
startRecording();
} catch (IOException e) {
e.printStackTrace();
}
recordLabel.setText("Recording Started");
}
});
recordStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopRecording();
recordLabel.setText("Recording Stopped");
}
});
}
private void startRecording() throws IOException {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.prepare();
recorder.start();
}
private void stopRecording() {
if (recorder != null) {
try {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
我在清单中有遵循权限。
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE"/>
,这些是我运行活动时遇到的错误
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/recorded_audio.3gp: open failed: EPERM (Operation not permitted)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:289)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:152)
at android.media.MediaRecorder.prepare(MediaRecorder.java:1091)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.startRecording(UploadAudio.java:92)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.access$000(UploadAudio.java:20)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio$1.onClick(UploadAudio.java:66)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err: at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.system.ErrnoException: open failed: EPERM (Operation not permitted)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
W/System.err: at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7542)
at libcore.io.IoBridge.open(IoBridge.java:478)
... 18 more
W/System.err: java.lang.IllegalStateException
at android.media.MediaRecorder.stop(Native Method)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.stopRecording(UploadAudio.java:100)
W/System.err: at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.access$200(UploadAudio.java:20)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio$2.onClick(UploadAudio.java:77)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
任何帮助都会是非常感谢! :)
Hi there I was hoping somebody can help me, I am building an app which has audio recording functionality and I am trying to build just a demo media recorder app based on tutorials but I keep facing issues, I have permissions for Recording, read/write storage in manifest but my app crashes when I try to record or stop recording.
Here is my Java code
public class UploadAudio extends AppCompatActivity {
private Button recordAudio, recordStop;
private TextView recordLabel;
private MediaRecorder recorder;
private String fileName = null;
private static final String LOG_TAG = "Record Log";
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
// Requesting permission to RECORD_AUDIO
private boolean permissionToRecordAccepted = false;
private String [] permissions = {Manifest.permission.RECORD_AUDIO};
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case REQUEST_RECORD_AUDIO_PERMISSION:
permissionToRecordAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
break;
}
if (!permissionToRecordAccepted ) finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload_audio);
ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);
recordAudio = findViewById(R.id.record_button);
recordStop = findViewById(R.id.record_stop);
recordLabel = findViewById(R.id.record_label);
fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
fileName += "/recorded_audio.3gp";
recordAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
startRecording();
} catch (IOException e) {
e.printStackTrace();
}
recordLabel.setText("Recording Started");
}
});
recordStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopRecording();
recordLabel.setText("Recording Stopped");
}
});
}
private void startRecording() throws IOException {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.prepare();
recorder.start();
}
private void stopRecording() {
if (recorder != null) {
try {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
i have following permissions in my manifest.
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE"/>
And these are the errors I get when I run the activity
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/recorded_audio.3gp: open failed: EPERM (Operation not permitted)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:289)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:152)
at android.media.MediaRecorder.prepare(MediaRecorder.java:1091)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.startRecording(UploadAudio.java:92)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.access$000(UploadAudio.java:20)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio$1.onClick(UploadAudio.java:66)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err: at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.system.ErrnoException: open failed: EPERM (Operation not permitted)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
W/System.err: at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7542)
at libcore.io.IoBridge.open(IoBridge.java:478)
... 18 more
W/System.err: java.lang.IllegalStateException
at android.media.MediaRecorder.stop(Native Method)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.stopRecording(UploadAudio.java:100)
W/System.err: at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio.access$200(UploadAudio.java:20)
at com.example.saferouteproject_eoinmcdonald_x18103880.UploadAudio$2.onClick(UploadAudio.java:77)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
any help would be greatly appreciated! :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论