如何在 exoplayer 中播放外部存储中的文件?

How to play file from external storage in 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)

有人可以帮忙吗?

如评论中所述,错误表明系统将您尝试打开的路径视为目录而不是文件。

open failed: EISDIR (Is a directory)

您打开文件的代码看起来不错,因此出现此类错误的一个常见原因是实际创建或存储文件的代码创建了目录而不是文件 - 例如如果调用以下内容:

yourFilePath.mkdirs()

这实际上会创建一个名为 'yourFilePath' 的目录,而不是为名为 'yourFilePath'.

的文件创建一个目录