При нажатии кнопки StartRead вылетает с ошибкой. В чем проблема? И еще вопрос, как эти данные из потока записать в музыкальный файл?
Log
FATAL EXCEPTION: Thread-2
Process: com.example.gukov.slyrecord, PID: 13593
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:208)
at android.os.Handler.<init>(Handler.java:122)
at android.widget.Toast$TN.<init>(Toast.java:351)
at android.widget.Toast.<init>(Toast.java:106)
at android.widget.Toast.makeText(Toast.java:265)
at com.example.gukov.slyrecord.MainActivity$1.run(MainActivity.java:81)
at java.lang.Thread.run(Thread.java:761
)
MainActivity
public class MainActivity extends Activity {
final String TAG = "myLogs";
int myBufferSize = 8192;
AudioRecord audioRecord;
boolean isReading = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createAudioRecorder();
Toast.makeText(getApplicationContext(), "init state = " + audioRecord.getState(), Toast.LENGTH_SHORT).show();
Log.d(TAG, "init state = " + audioRecord.getState());
}
void createAudioRecorder() {
int sampleRate = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minInternalBufferSize = AudioRecord.getMinBufferSize(sampleRate,
channelConfig, audioFormat);
int internalBufferSize = minInternalBufferSize * 4;
Toast.makeText(getApplicationContext(), "minInternalBufferSize = " + minInternalBufferSize
+ ", internalBufferSize = " + internalBufferSize
+ ", myBufferSize = " + myBufferSize, Toast.LENGTH_SHORT).show();
Log.d(TAG, "minInternalBufferSize = " + minInternalBufferSize
+ ", internalBufferSize = " + internalBufferSize
+ ", myBufferSize = " + myBufferSize);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, channelConfig, audioFormat, internalBufferSize);
}
public void recordStart(View v) {
Toast.makeText(getApplicationContext(), "record start", Toast.LENGTH_SHORT).show();
Log.d(TAG, "record start");
audioRecord.startRecording();
int recordingState = audioRecord.getRecordingState();
Toast.makeText(getApplicationContext(), "recordingState = " + recordingState, Toast.LENGTH_SHORT).show();
Log.d(TAG, "recordingState = " + recordingState);
}
public void recordStop(View v) {
Toast.makeText(getApplicationContext(), "record stop", Toast.LENGTH_SHORT).show();
Log.d(TAG, "record stop");
audioRecord.stop();
}
public void readStart(View v) {
Toast.makeText(getApplicationContext(), "read start", Toast.LENGTH_SHORT).show();
Log.d(TAG, "read start");
isReading = true;
new Thread(new Runnable() {
@Override
public void run() {
if (audioRecord == null)
return;
byte[] myBuffer = new byte[myBufferSize];
int readCount = 0;
int totalCount = 0;
while (isReading) {
readCount = audioRecord.read(myBuffer, 0, myBufferSize);
totalCount += readCount;
Toast.makeText(getApplicationContext(), "readCount = " + readCount + ", totalCount = "
+ totalCount, Toast.LENGTH_SHORT).show();
Log.d(TAG, "readCount = " + readCount + ", totalCount = "
+ totalCount);
}
}
}).start();
}
public void readStop(View v) {
Toast.makeText(getApplicationContext(), "read stop", Toast.LENGTH_SHORT).show();
Log.d(TAG, "read stop");
isReading = false;
}
@Override
protected void onDestroy() {
super.onDestroy();
isReading = false;
if (audioRecord != null) {
audioRecord.release();
}
}
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Можно ли вызывать прорисовку скомпилиного листа glCallList между glNewList(list, GL_COMPILE) и glEndList()? Не будет ли ошибка?
есть обычный див на нём есть спан на который при нажатии добавляется точно такой же блок клик и добавление блока идёт динамически через $('body')on('click','
При помощи socket'a приходят данныеЕсть таблица, в которую эти данные попадают, у каждой ячейки есть ref, который равен её id