如您所知,在新操作系统上,后台服务有一些限制,并且还引入了打盹模式。我的目的是在应用程序在特定时间和一段时间内处于后台时录制音频。所以我有两个问题:
A)如果我有root手机,我的应用程序获得root权限。我是否可以像旧版本的android一样运行后台服务,而不会让系统杀死它,然后记录我想要的内容?
B)如果我有一个非根电话:我已经尝试过使用不同变种的AlarmManager方法,但结果非常不可预测。首先,我试着检查哪个是允许我在进程被杀之前记录的最长时间:
AlarmCreated类:
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分钟。
那么实现目标的最佳途径是什么?没有根电话?