Mediarecorder不工作Android Studio Java,继续遇到错误

发布于 2025-01-26 21:57:36 字数 6624 浏览 2 评论 0原文

嗨,我希望有人可以帮助我,我正在构建一个具有录音功能的应用程序,我试图根据教程构建一个演示媒体录音机应用程序,但我一直面临问题,我拥有录制,读/写入/写作的权限在清单中存储,但是当我尝试录制或停止录制时,我的应用程序会崩溃。

这是我的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文