Почему некоторые пользователи иногда получают «Cannot create AudioTrack» при создании AudioTrack в Android / Kotlin - PullRequest
0 голосов
/ 29 марта 2019

Я записываю звук с микрофона устройства.Записанные данные записываются в файл.Всякий раз, когда запись заканчивается, я создаю AudioTrack, который получает файл и должен воспроизводить аудио.Это все работает на всех устройствах.

Я добавил приложение в качестве бета-версии в PlayStore, и теперь у меня возникают некоторые сбои в Crashlytics, показывающие, что некоторые пользователи иногда получают следующую ошибку.

Fatal Exception: java.lang.UnsupportedOperationException
Cannot create AudioTrack

В соответствии с трассировкой стека в этой строке из кода ниже: .build().

Я добавил несколько журналов Crashlytics, чтобы посмотреть, были ли какие-либо странные данные переданы методу build, ноТам нет никаких проблем.

Согласно Crashlytics, пока это происходило только на Android 6, 7 и 8 (minSdkVersion = 21).В качестве ссылки на то, как часто это происходило: это затронуло около 100 пользователей за последние 7 дней, в то время как приложение загружалось примерно 500 раз в день.

private var _audioTrack: AudioTrack
private var _bufferSize: Int = 0

...

init {
    _bufferSize = AudioTrack.getMinBufferSize(_sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT)

    _audioTrack = createAudioTrack(_sampleRate)
}

private fun createAudioTrack(sampleRate: Int): AudioTrack {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return AudioTrack(
                AudioManager.STREAM_MUSIC,
                sampleRate,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                _bufferSize,
                AudioTrack.MODE_STREAM)
    }

    Crashlytics.log("createAudioTrack. _bufferSize: $_bufferSize. sampleRate: $sampleRate")

    return AudioTrack.Builder()
            .setAudioAttributes(AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build())
            .setAudioFormat(AudioFormat.Builder()
                    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                    .setSampleRate(sampleRate)
                    .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
                    .build())
            .setBufferSizeInBytes(_bufferSize)
            .build()
}

...

Для всех пользователей этот метод работает.Просто иногда для некоторых людей приложение вылетает.

...