MediaPlayer загружает звук из Uri, не работает

У меня есть простое приложение для записи голоса. Когда пользователь что-то записывает, оно сохраняется во внешнем хранилище, а затем воспроизводится оттуда.

Все работает нормально, кроме смартфона Huawei P8 Lite с Android 6.

Вот как я играю звук:

    Thread th=new Thread(new Runnable() {
        @Override
        public void run() { 
            try {
                MediaPlayer mp = new MediaPlayer();
                mp.setDataSource(view.getContext(), uri);
                mp.prepare();
                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        mp.release();
                    }
                });

                mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //send message to handler
        }
    });
    th.start();

Uri существует в данный момент, а также файл существует в месте назначения. Почему мой медиаплеер ничего не воспроизводит? Разрешения предоставляются в этот момент, когда он пытается создать MediaPlayer, поэтому это не должно быть проблемой разрешения.

Все, что я получаю в логарифме, это:

W/MediaPlayer-JNI: MediaPlayer finalized without being released 
I/MediaPlayer: setDataSource(34, 0, 576460752303423487) 
I/MediaPlayer: [HSM] stayAwake true uid: 10255, pid: 22592 
E/MediaPlayer: error (-19, 0) 
E/MediaPlayer: Error (-19,0)

Как я уже сказал, он отлично работает на всех других устройствах, которые я тестировал (Android 10 и Android 9).

ИЗМЕНИТЬ

Вот что я пробовал: я создал эмуляторы с каждым уровнем API от API 18 до 30, и он отлично работает на каждом эмуляторе. Я сбросил свой смартфон Huawei P8 Lite до заводских настроек. Я проверил, правильно ли сохранен звуковой файл, и могу ли я открыть и воспроизвести его вручную, когда я перемещаюсь в папке, в которой он был сохранен (он работает отлично, поэтому он не имеет ничего общего с кодом, который сохраняет звук) я действительно исчерпал идей.

Надеюсь, кто-то может помочь, спасибо!


person Aaron Waller    schedule 06.12.2020    source источник


Ответы (1)


Вам нужно подготовить игрока асинхронно. player. prepare() замените приведенным ниже кодом:

player.prepareAsync()
person Atakan Coşar    schedule 06.12.2020
comment
Не работает. prepareAsync() используется, когда вы помещаете код в mainThread. В любом случае спасибо - person Aaron Waller; 06.12.2020