#android #exoplayer
#Android #exoplayer
Вопрос:
Из активов все работает нормально! Но из внешнего хранилища нет.
Это мой экземпляр exoplayer:
// ExoPlayer
val renderesFactory = DefaultRenderersFactory(
this,
DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF
)
val trackSelector = DefaultTrackSelector()
exoPlayer = ExoPlayerFactory.newSimpleInstance(
this@PlayerService,
renderesFactory,
trackSelector
)
exoPlayer!!.addListener(exoPlayerListener)
Здесь я пытаюсь построить путь:
val dirPath = applicationContext.getExternalFilesDir(audio.uri)!!.absolutePath
val filePath = "$dirPath/001.mp3"
val audioFile = File(filePath)
val uri = Uri.fromFile(audioFile)
prepareToPlay(uri)
audio.uri —> «Downloads/audio_reading/»
И это метод prepareToPlay():
private fun prepareToPlay(uri: Uri) {
if (uri != currentUri) {
currentUri = uri
val userAgent = Util.getUserAgent(this@PlayerService, "ExoPlayer")
val mediaSource = ExtractorMediaSource(
uri,
DefaultDataSourceFactory(this@PlayerService, userAgent),
DefaultExtractorsFactory(), null, null
)
exoPlayer!!.prepare(mediaSource)
}
}
Когда я запускаю приложение и нажимаю «воспроизвести», я получаю эту ошибку:
E/ExoPlayerImplInternal: Source error.
com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.music.app/files/Downloads/audio_reading/001.mp3: open failed: EISDIR (Is a directory)
at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:73)
at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:250)
at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:886)
at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.music.app/files/Downloads/audio_reading/001.mp3: open failed: EISDIR (Is a directory)
at libcore.io.IoBridge.open(IoBridge.java:485)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:288)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:151)
at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:65)
at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:250)
at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:886)
at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: android.system.ErrnoException: open failed: EISDIR (Is a directory)
at libcore.io.IoBridge.open(IoBridge.java:475)
Кто-нибудь может помочь?
Комментарии:
1. Похоже, что файл, который вы хотите воспроизвести, представляет собой каталог. Попробуйте удалить его и снова запустите код.
2. Но файл должен быть там, и это не каталог. Это файл mp3
3. У вас есть разрешение на чтение внешних файлов?
4. ДА. Я прошу разрешения при запуске приложения
5. Хм, хорошо, не могли бы вы попробовать удалить папку загрузки и перезапустить код?
Ответ №1:
Как упоминалось в комментариях, ошибка указывает на то, что система видит путь, который вы пытаетесь открыть, не как файл, а как каталог.
не удалось открыть: EISDIR (это каталог)
Ваш код для открытия файла выглядит хорошо, поэтому одна из распространенных причин подобной ошибки заключается в том, что код, который фактически создал или сохранил файл, создал каталог, а не файл — например, если вызывается следующее:
yourFilePath.mkdirs()
Это фактически создаст каталог с именем ‘yourFilePath’, а не создаст каталог для файла с именем ‘yourFilePath’.
Комментарии:
1. Да, вы правы. Большое спасибо! проблема заключалась в том, что я пытался работать с SD-картой, но система работала вне SD-карты. И внутри SD-карты был мой файл, но внутри Android/data/file/ … была папка.