У меня есть простое приложение для записи голоса. Когда пользователь что-то записывает, оно сохраняется во внешнем хранилище, а затем воспроизводится оттуда.
Все работает нормально, кроме смартфона 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 до заводских настроек. Я проверил, правильно ли сохранен звуковой файл, и могу ли я открыть и воспроизвести его вручную, когда я перемещаюсь в папке, в которой он был сохранен (он работает отлично, поэтому он не имеет ничего общего с кодом, который сохраняет звук) я действительно исчерпал идей.
Надеюсь, кто-то может помочь, спасибо!