Ошибка AudioRecord и запись потока в файл в Android

165
01 марта 2018, 12:38

При нажатии кнопки 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();
        }
    }
}
READ ALSO
Вызов glCallList в list compile

Вызов glCallList в list compile

Можно ли вызывать прорисовку скомпилиного листа glCallList между glNewList(list, GL_COMPILE) и glEndList()? Не будет ли ошибка?

170
Динамическое добавление и обработка на js jqeury

Динамическое добавление и обработка на js jqeury

есть обычный див на нём есть спан на который при нажатии добавляется точно такой же блок клик и добавление блока идёт динамически через $('body')on('click','

159
Загрузка странички AJAX-ом

Загрузка странички AJAX-ом

При загрузки странички аяксом

296
React JS - Как при помощи ref изменять состояния компонентов динамически?

React JS - Как при помощи ref изменять состояния компонентов динамически?

При помощи socket'a приходят данныеЕсть таблица, в которую эти данные попадают, у каждой ячейки есть ref, который равен её id

191