簡體   English   中英

java.io.FileNotFoundException:打開失敗:EACCES(權限被拒絕),同時嘗試使用 JobIntentService 記錄

[英]java.io.FileNotFoundException: open failed: EACCES (Permission denied) while trying to record using JobIntentService

我正在嘗試使用廣播接收器和 JobIntentService 設置 android 通話記錄器。 但是,每當我啟動 JobIntentService 時,Mediarecorder.prepare ()方法都會引發如下錯誤:

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Music/filename.3gp: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:496)
W/System.err:     at java.io.RandomAccessFile.<init>(RandomAccessFile.java:289)
W/System.err:     at java.io.RandomAccessFile.<init>(RandomAccessFile.java:152)
W/System.err:     at android.media.MediaRecorder.prepare(MediaRecorder.java:1046)
W/System.err:     at com.example.callrecorder.Job.recordCall(Job.java:77)
W/System.err:     at com.example.callrecorder.Job.onHandleWork(Job.java:38)
W/System.err:     at androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:392)
W/System.err:     at androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:383)
W/System.err:     at android.os.AsyncTask$3.call(AsyncTask.java:378)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err:     at java.lang.Thread.run(Thread.java:919)
W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.Linux.open(Native Method)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
W/System.err:     at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7255)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:482)
W/System.err:   ... 12 more
I/Try: java.io.FileNotFoundException: /storage/emulated/0/Music/filename.3gp: open failed: EACCES (Permission denied)
E/MediaRecorder: start called in an invalid state: 4
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.callrecorder, PID: 10311
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:399)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.lang.IllegalStateException
        at android.media.MediaRecorder.start(Native Method)
        at com.example.callrecorder.Job.recordCall(Job.java:82)
        at com.example.callrecorder.Job.onHandleWork(Job.java:38)
        at androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:392)
        at androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:383)
        at android.os.AsyncTask$3.call(AsyncTask.java:378)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919)

我的 JobIntentService 的代碼如下:

public class Job extends JobIntentService {
    static final int JOB_ID = 1000;
    String state;

    MediaRecorder mediaRecorder;

    static void enqueueWork(Context context, Intent intent) {
        enqueueWork(context, Job.class, JOB_ID, intent);
    }


    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        Log.i("Job", "Triggered");
        state = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
        switch (state) {
            case "OFFHOOK": {
                recordCall();
            }
            break;
            case "IDLE": {
                stopRecording();
            }
            break;
        }
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }


    private void stopRecording() {
        Log.i("Stato", "Stopped");
        mediaRecorder.stop();
        mediaRecorder.release();
        mediaRecorder = null;
    }

    private void recordCall() {

        String recordPath = null;

        String path = Environment.getExternalStoragePublicDirectory(DIRECTORY_MUSIC).getAbsolutePath();
        File dir = new File(path);
        if(!dir.exists()) {
            dir.mkdirs();
        }
        String myFile = "filename.3gp";

        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setOutputFile(dir + "/" + myFile);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        try {
            mediaRecorder.prepare();
        } catch (Exception e) {
            e.printStackTrace();
            Log.i("Try", String.valueOf(e));
        }
        mediaRecorder.start();
        Log.i("Stato", "Started");
    }
}

此服務的意圖是從廣播接收器傳遞的,並且一切運行良好,我嘗試通過刪除媒體記錄器部分進行檢查。 出於某種原因,每當我嘗試啟動媒體記錄器說 Permission Denied 時,它都會引發錯誤。 我在 Android 清單文件中授予了WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE、RECORD_AUDIO、READ_PHONE_STATE、PROCESS_OUTGOING_CALLS權限。 jobservice 和receiver 也已注冊。

從 Android 10 起,您需要舊權限才能以舊方式訪問存儲或切換到使用新方法。 將此添加到清單中的應用程序下以用於舊版存儲。

android:requestLegacyExternalStorage="true"

android 10 中的通話錄音功能也已停止,因此如果沒有輔助功能選項,您將無法再在其上錄音。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM