Итак, для фона я пытаюсь создать приложение, которое непрерывно записывает данные через микрофон и сохраняет данные в буфере. Целью программы было бы выполнять некоторый тип обработки данных в буфере и воздействовать на него. В настоящее время приложение просто считывает данные в буфер и записывает их как можно скорее. При запуске приложения вы говорите в микрофон, а затем слышите, что вы только что говорили, выходят на другой конец.Как остановить/запустить службу, содержащую бесконечный цикл при создании
Теперь вот где моя неопытность с Android начинает поднимать голову. Я выполняю операцию чтения и записи как бесконечный цикл. Сервис находится ниже:
public class AudioService extends Service {
private final int MIC = AudioSource.MIC;
private final int SAMPLE = 44100;
private final int CHANNELI = AudioFormat.CHANNEL_IN_MONO;
private final int CHANNELO = AudioFormat.CHANNEL_OUT_MONO;
private final int FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private final int BUFFERSIZE = AudioRecord.getMinBufferSize(SAMPLE,
CHANNELI, FORMAT);
private final int STREAM = AudioManager.STREAM_MUSIC;
private final int MODE = AudioTrack.MODE_STREAM;
private boolean play = true;
AudioRecord recorder = null;
AudioTrack track = null;
short[] buffer = null;
public void OnCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
recorder = new AudioRecord(MIC, SAMPLE, CHANNELI, FORMAT, BUFFERSIZE);
track = new AudioTrack(STREAM, SAMPLE, CHANNELO, FORMAT, BUFFERSIZE,
MODE);
buffer = new short[BUFFERSIZE];
recorder.startRecording();
track.play();
while (play) {
recorder.read(buffer, 0, buffer.length);
track.write(buffer, 0, buffer.length);
}
return START_STICKY;
}
Эта услуга вызывается, когда нажата кнопка «Запись» в действии. Я хочу, чтобы иметь возможность щелкнуть запись и иметь возможность щелчка отменить, чтобы остановить этот цикл. Нижеприведенный слушатель:
private OnClickListener Recording = new OnClickListener() {
public void onClick(View v) {
serviceIntent = new Intent(getApplicationContext(),
AudioService.class);
serviceIntent.putExtra("extraData", "somedata");
startService(serviceIntent);
record.setEnabled(false);
cancel.setEnabled(true);
cancel.requestFocus();
};
И теперь проблема становится очевидной. Приложение не может завершить выполнение, когда оно достигает startService (serviceIntent), и просто зависает в балансе.
Итак, каково мое обращение? Я думал о каком-то способе управления сервисом из бесконечного цикла, но моя неопытность с Android оставляет мне интересно, как это сделать. Подстрекать какой-то способ сломаться, возможно, создавая новую кнопку внутри цикла; поэтому во время startIntent я смог бы вырваться из цикла и «закончить безумие».
Любая помощь будет оценена по достоинству. Я также понимаю, что эта служба должна запускаться в отдельном потоке из пользовательского интерфейса, чтобы избежать проблемы «Приложение не отвечает ...», но это своего рода другая тема. Моя главная цель прямо сейчас - выйти из цикла, и я буду признателен за любую помощь или руководство о том, как это сделать.
Отлично! Я получу работу по перемещению цикла в фоновый поток. Существует кнопка отмены, целью которой было остановить все это, но я продолжал повесить трубку после нажатия на «Запись». Благодаря! – user1429581