Как вы знаете, в новых операционных системах фоновые службы имеют некоторые ограничения, а также введен режим Doze. Моя цель - записывать звук, когда приложение находится в фоновом режиме в определенное время и в течение определенного периода времени. Итак, у меня есть два вопроса:
A) Если у меня есть рутированный телефон, и мое приложение получает права root. Могу ли я непрерывно запускать фоновый сервис, например, более старую версию Android, чтобы система не убивала его, а затем записывать столько, сколько я хочу?
B) В случае, если у меня нет телефона root: я попробовал подход AlarmManager, используя разные варианты, но результаты очень непредсказуемы. Прежде всего я попытался проверить, какое максимальное количество времени позволяет мне записывать, прежде чем процесс будет остановлен:
AlarmCreated Class:
Calendar cal = Calendar.getInstance();
AlarmManager alarm2 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent2 = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 2 , intent2, 0);
alarm2.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + (1*1000) , pendingIntent2);
Класс AlarmReceiver:
public void onReceive(Context context, Intent intent) {
Calendar cal = Calendar.getInstance();
alarm = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(context, 1 , intent, 0);
alarm.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + ((2*60*1000) + 10000), pendingIntent);
AsyncAudio bg = new AsyncAudio(context);
bg.execute();
}
Класс AsyncAudio:
public class AsynkAudio extends AsyncTask<Void, Void, Void> implements MediaRecorder.OnInfoListener{
@Override
protected Void doInBackground(Void... voids) {
startRecording();
return null;
}
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
stopRecording(true);
}
}
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioEncodingBitRate(64000);
mRecorder.setOnInfoListener(this);
mRecorder.setMaxDuration(2*60*1000);
mRecorder.setAudioSamplingRate(16000);
mOutputFile = getOutputFile();
mOutputFile.getParentFile().mkdirs();
mRecorder.setOutputFile(mOutputFile.getAbsolutePath());
try {
mRecorder.prepare();
mRecorder.start();
} catch (IOException e) {
}
}
private File getOutputFile() {
SimpleDateFormat dateFormat = new SimpleDateFormat
("yyyyMMdd_HHmmssSSS", Locale.ITALY);
return new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS)
+ "/Voice Recorder/RECORDING_"
+ dateFormat.format(new Date())
+ ".m4a");
}
protected void stopRecording(boolean saveFile) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
То, что я получаю, это аудио с разной длительностью. От 6 секунд до 2 минут, как ожидалось.
Итак, что будет лучшим подходом для достижения моей цели? Без рут-телефона?