屏幕锁定时无法使用 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"
添加到服务标签。
是一个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"
添加到服务标签。