startRecording() вызывается для неинициализированной AudioRecord на телефонах Samsung S7

У меня есть приложение тюнера и использую объект Audio Record для прослушивания микрофона. Я хочу понять, что он отлично работает для большинства устройств и версий Android (даже для Android 6), но я получил сообщение об ошибке от клиентов на телефонах Samsung S7. Я просмотрел похожие посты здесь, чтобы избежать этой ошибки, и она мне очень помогла. Но теперь я не могу понять, почему только телефоны S7 выдают эту ошибку, в то время как она работает нормально на других устройствах Android 6.

PS У меня нет телефона S7, поэтому у меня не было возможности что-то попробовать. Мне просто интересно, есть ли у кого подобные проблемы и в чем может быть проблема с телефонами S7. Есть идеи?

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        initAudioRecord(44100, 2048);
        .....

    }

    public void initAudioRecord(int sampleRateInHz, int bufferSizeInBytes) {

            AudioRecord audioRecord = AudioRecordInstance(sampleRateInHz, bufferSizeInBytes);


            if (audioRecord.getState() != AudioRecord.STATE_UNINITIALIZED) {
                if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
                    audioRecord.stop();
                }
                audioRecord.release();
                audioRecord = AudioRecordInstance(sampleRateInHz, bufferSizeInBytes); 

            }

            audioRecord.startRecording();     

    }

    public AudioRecord AudioRecordInstance(int sampleRateInHz, int bufferSizeInBytes){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            return new AudioRecord.Builder()
                    .setAudioSource(MediaRecorder.AudioSource.MIC)
                    .setAudioFormat(new AudioFormat.Builder()
                            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                            .setSampleRate(sampleRateInHz)
                            .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
                            .build())
                    .setBufferSizeInBytes(2*bufferSizeInBytes)
                    .build();
        }else{
            return new AudioRecord(
                    MediaRecorder.AudioSource.MIC,
                    sampleRateInHz,
                    AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    bufferSizeInBytes * 2);
        }
    }
}

LogCat:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tuner/com.tuner.TunerActivity}: java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
    at android.app.ActivityThread.access$1100(ActivityThread.java:221)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7224)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

1 ответ

Решение

Наконец, я заметил, что он не падает только на телефонах S7, но и на некоторых других устройствах Android 6.0. И я понял, что моя глупая ошибка в том, что я забыл справиться с новым дизайном разрешений во время выполнения, придумал зефир. Что меня смущает: он работает на некоторых других устройствах Android 6.0. Я думаю, это те, которые уже имеют разрешения для моего приложения из настроек устройства.

Итак, я реализовал разрешения времени выполнения внутри своего приложения для Marshmallow, и теперь оно работает.

Другие вопросы по тегам