У меня есть приложение чата, и я пытаюсь отправить голос после преобразования его в байт []. В моем пользовательском интерфейсе есть кнопка с OnTouchListener, и на самом деле это просто sh для разговора.
Я пробовал приведенное ниже решение, которое я видел в аналогичном вопросе, но я никогда не вылезал пока l oop .
public void captureAudio() throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ParcelFileDescriptor[] descriptors = ParcelFileDescriptor.createPipe();
ParcelFileDescriptor parcelRead = new ParcelFileDescriptor(descriptors[0]);
ParcelFileDescriptor parcelWrite = new ParcelFileDescriptor(descriptors[1]);
InputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead);
try {
recorder = new MediaRecorder();
recorder.setAudioSource(AudioSource.MIC);
recorder.setOutputFormat(OutputFormat.AMR_NB);
recorder.setAudioEncoder(AudioEncoder.AMR_NB);
recorder.setOutputFile(parcelWrite.getFileDescriptor());
recorder.prepare();
recorder.start();
isRecording = true;
}catch (Exception e){
e.printStackTrace();
}
RecordingListener listener=new RecordingListener() {
@Override
public void onChange(boolean isRecording) throws IOException {
if(!isRecording)
inputStream.close();
}
};
listener.onChange(isRecording);
Log.d(TAG, " recording " + isRecording);
int read;
byte[] data = new byte[200];
while ((read = inputStream.read(data, 0, data.length)) != -1) {
Log.d(TAG, "read speech " + read);
byteArrayOutputStream.write(data, 0, read);
}
Log.d(TAG, "byte array " + byteArrayOutputStream);
String dataToSend = android.util.Base64.encodeToString(byteArrayOutputStream.toByteArray()
, android.util.Base64.DEFAULT);
sendMessage(dataToSend);
byteArrayOutputStream.flush();
}
public void stopCapturingAudio() throws IOException {
isRecording=false;
Log.d(TAG, "stopped recording ");
try {
recorder.stop();
Log.d(TAG, " recording " + isRecording);
recorder.reset();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
При нажатии кнопки вызывается captureAudio();
, а когда она отпущена, вызывается stopCapturingAudio();
. Это как InputStream
не закрывается. Я даже добавил слушателя к логическому isRecording
, но все же не заставил его работать.