Есть два способа написания этого кода, оба протестированы на устройстве
Прежде всего, убедитесь, что вы правильно обрабатываете android.permission.READ_EXTERNAL_STORAGE
и у вас действительно правильный Uri.
MediaPlayer.create(this, uri);
потерпит неудачу, если контекст или uri будут недействительными.
MediaPlayer.create(this, uri);
, который сам уже готовит игрока, так что не нужно .prepareAsync()
в этой ситуации. и ваш код хорош для go.
по-другому:
mediaPlayer = new MediaPlayer(); // hence, we don't use .create, manually instantiate
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(this, uri);
mediaPlayer.setOnPreparedListener(mp -> {
mediaPlayer.start();
});
/* use async, if you don't want to block UI thread
keep in mind, this should be called after setting listener
because it might prepare even until the listener has been set */
mediaPlayer.prepareAsync();
} catch (Exception e) {
Log.e("ERROR", e.toString());
}