Как воспроизвести файл с внешнего хранилища в exoplayer?

#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/ … была папка.