Итак, для фона я пытаюсь создать приложение, которое непрерывно записывает через микрофон и сохраняет данные в буфере. Цель программы состоит в том, чтобы выполнить некоторую обработку данных в буфере и воздействовать на нее. В настоящее время приложение просто считывает данные в буфер и записывает их как можно скорее. При запуске приложения можно было говорить в микрофон, а затем слышать то, что вы только что говорили, на другом конце.
Вот тут-то и начинает проявляться мой неопытный опыт работы с 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 я смогу вырваться из цикла и «покончить с безумием».
Будем признательны за любую помощь. Я также понимаю, что эту службу следует запускать в отдельном потоке от пользовательского интерфейса, чтобы избежать проблемы «Приложение не отвечает ...», но это уже другая тема. Моя главная цель на данный момент - выйти из цикла, и я был бы признателен за любую помощь или указание о том, как это сделать.