屏幕锁定时无法使用 mediarecord 进行录制。试过 WakeLock 但没有结果

Can't record with mediarecord when screen is locked. Tried WakeLock but no result

是一个ForegroundService,其中OnCreate函数如下:

public void onCreate() {
    super.onCreate();
    final long RECORDING_INTERVAL = 30000;

    TimerTask recordingTask = new TimerTask() {
        public void run() {
            if (wakeLock == null) {
                Log.d("WakeLock", "WakeLock");
                pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "FlexRat::Tag");
                wakeLock.acquire();
            }

            Log.i("Debug", "Recording Task");
            stopRecording();
            startRecording();
        }
    };

    Timer recordingTimer = new Timer();
    recordingTimer.scheduleAtFixedRate(recordingTask, 0, RECORDING_INTERVAL);
}

而startRecording()方法如下:

private void startRecording() {
    Log.i("Info", "NEW RECORDING");
    try {
        recorder = new MediaRecorder();

        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

        Date today = Calendar.getInstance().getTime();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.ENGLISH);
        String reportDate = formatter.format(today);

        File instanceRecordDirectory = new File(getStoragePath());
        File instanceRecord = new File(instanceRecordDirectory.getAbsolutePath() + File.separator + reportDate + ".mp4");

        if (!instanceRecordDirectory.exists()) {
            instanceRecordDirectory.getParentFile().mkdirs();
            instanceRecordDirectory.mkdirs();
        }

        if (!instanceRecord.exists()) {
            instanceRecord.createNewFile();
        }

        recorder.setOutputFile(instanceRecord.getAbsolutePath());

        recorder.prepare();
        recorder.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

当我关闭设备时抛出异常,我得到的堆栈跟踪是:

I/MediaRecorderJNI: setAudioSource(1)
W/System.err: java.lang.RuntimeException: setAudioSource failed.
        at android.media.MediaRecorder._setAudioSource(Native Method)
        at android.media.MediaRecorder.setAudioSource(MediaRecorder.java:797)
        at com.multimedia.flexrat.BackgroundService.startRecording(BackgroundService.java:125)
        at com.multimedia.flexrat.BackgroundService.access0(BackgroundService.java:42)
        at com.multimedia.flexrat.BackgroundService.run(BackgroundService.java:70)
        at java.util.TimerThread.mainLoop(Timer.java:562)
        at java.util.TimerThread.run(Timer.java:512)

我想要的是 recordingTask 即使在设备被锁定后仍保持 运行。此时我不关心电池使用情况。我知道这是一个非常沉重的线程。我只是想让它现在工作。有人能指出我正确的方向吗?我在网上搜索了很多,但没有结果。

我找到了解决办法!问题出在我的清单文件中,我不知道我必须将 android:foregroundServiceType="microphone" 添加到服务标签。