Java 为什么即使我使用WakeLock,当设备进入睡眠状态时,AudioRecord也不录制声音?

Java 为什么即使我使用WakeLock,当设备进入睡眠状态时,AudioRecord也不录制声音?,java,android,Java,Android,我正在使用AudioRecord录制设备中的声音,并将其写入.wav文件,即使设备进入睡眠状态,我也需要它在文件中保持录制和写入。因此,我将wakeLock与PARTIAL_WAKE_LOCK参数一起使用。但是在设备进入睡眠状态后,录音继续录音,但没有声音。当我打开一个.wav文件时,从设备进入睡眠状态的那一刻起,就出现了一个静音 audioRecord.startRecording(); isReading = true; totalSizeInBytes = 0; new T

我正在使用AudioRecord录制设备中的声音,并将其写入.wav文件,即使设备进入睡眠状态,我也需要它在文件中保持录制和写入。因此,我将wakeLock与PARTIAL_WAKE_LOCK参数一起使用。但是在设备进入睡眠状态后,录音继续录音,但没有声音。当我打开一个.wav文件时,从设备进入睡眠状态的那一刻起,就出现了一个静音

audioRecord.startRecording();
isReading = true;
totalSizeInBytes = 0;        
new Thread(new Runnable() {
        @Override
        public void run() {
            short[] buffer = new short[bufferSize]; //buffer of shorts, getting from audioRecord
            int readCount;
            int state;
            int check = 0;
                        //wakeLock initialization and acquiring
            PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp:RecordWakeLock");
            wakeLock.acquire();
            if (isWavFileCreated) {
                while (isReading) {
                    Log.d(TAG, audioRecord.getRecordingState() + "");
                    readCount = audioRecord.read(buffer, 0, bufferSize);
                    writeWavFile(buffer);
                }
                writeWavFileHeader();
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();

audioRecord.getRecordState()始终返回true。我不知道问题出在哪里。

您应该在独立线程中开始录制/初始化
录音
,然后从前台
服务启动您需要的此线程。同样,在开始记录之前,更改线程优先级,如下例所示:

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);

AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC,
            sampleRate,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSize);
record.startRecording();
拉斯基拉斯的作品

但是,它并没有包含很多实际需要的代码,因此我总结了一个Github要点,演示了该方法:

这不是一个完全完成的项目(还有一些不需要的额外内容),但它包含了所有重要的部分,我可以确认它在我的设备(Mix3,Android 9)上工作,即使屏幕关闭了。(我按下电源并等待30多分钟,但它仍在记录麦克风输入。我以前的尝试都在大约2分钟后停止。)


有趣的是,我甚至不需要启动唤醒锁或wifi锁;但是,如果您发现您的设备需要使用前台服务和/或防止其他功能被挂起,那么该功能也包含在要点中。

为什么我应该在活动中使用前台服务而不仅仅是新线程?因为系统而不是服务更有可能终止活动,另外,你还可以在后台移动应用程序并继续录制。所以我不需要使用WakeLock?我使用了architecture Activity+Service->AudioRecordingThread,它在后台录制了一夜,早上几个小时后,我使用其他应用程序,然后手动停止录制。因此,记录了大约10个小时,没有中断或中断。