Android 如何使用exoplayer播放本地文件?

Android 如何使用exoplayer播放本地文件?,android,android-studio,exoplayer,Android,Android Studio,Exoplayer,我想使用exoPlayer播放本地文件(在内部或外部存储中)。我尝试了一些代码,但没有发现任何有用的东西。 代码: buildMediaSourceNew(): 使用此代码后,可以播放一些文件,而不能播放一些文件。例如: 第一个文件位置: /storage/emulated/0/Download/Short Animated Film.mp4 /storage/emulated/0/browser/#1 Django tutorials _ What is Django_ _ Python W

我想使用exoPlayer播放本地文件(在内部或外部存储中)。我尝试了一些代码,但没有发现任何有用的东西。 代码:

buildMediaSourceNew()

使用此代码后,可以播放一些文件,而不能播放一些文件。例如:
第一个文件位置:

/storage/emulated/0/Download/Short Animated Film.mp4
/storage/emulated/0/browser/#1 Django tutorials _ What is Django_ _ Python Web Framework.mp4
第二个文件位置:

/storage/emulated/0/Download/Short Animated Film.mp4
/storage/emulated/0/browser/#1 Django tutorials _ What is Django_ _ Python Web Framework.mp4
第一个文件可以播放,但下面第二个文件出现错误。
如果文件名包含“#”或“?”,exoplayer将无法播放

2020-09-18 20:40:56.985 10985-11347/com.example.learning E/ExoPlayerImplInternal:源代码错误
com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException:com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException:uri具有不受支持的查询和/或片段。是否对包含“?”或“#”的字符串调用了Uri.parse()?使用Uri.fromFile(新文件(路径))来避免这种情况。path=/storage/emulated/0/browser/,query=null,fragment=1 Django教程uu什么是Django_uuu_uu_uu_u_u_u_u_;Python Web Framework.mp4
位于com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:97)
位于com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
位于com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
在com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
位于com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
运行(Thread.java:764)
原因:com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException:uri包含不受支持的查询和/或片段。是否对包含“?”或“#”的字符串调用了Uri.parse()?使用Uri.fromFile(新文件(路径))来避免这种情况。path=/storage/emulated/0/browser/,query=null,fragment=1 Django教程uu什么是Django_uuu_uu_uu_u_u_u_u_;Python Web Framework.mp4
位于com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:112)
位于com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88)
位于com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
位于com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
在com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
位于com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
运行(Thread.java:764)
原因:java.io.FileNotFoundException:/storage/emulated/0/browser:open失败:EISDIR(是一个目录)
在libcore.io.IoBridge.open中(IoBridge.java:485)
位于java.io.RandomAccessFile。(RandomAccessFile.java:288)
位于java.io.RandomAccessFile。(RandomAccessFile.java:151)
位于com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:108)
位于com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88)
位于com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
位于com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
在com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
位于com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
运行(Thread.java:764)
原因:android.system.ErrnoException:open失败:EISDIR(是一个目录)
在libcore.io.IoBridge.open中(IoBridge.java:475)
位于java.io.RandomAccessFile。(RandomAccessFile.java:288)
位于java.io.RandomAccessFile。(RandomAccessFile.java:151)
位于com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:108)
位于com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88)
位于com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
位于com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
在com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
位于com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
运行(Thread.java:764)

如何避免此错误?

您是否尝试使用Uri.fromFile(新文件(路径))而不是Uri.parse(路径)?非常感谢。成功了。这很简单。Thanks@Unknown_2433如果你发现任何有用的评论,请投赞成票。这将有助于其他人,如果您自己找到了任何解决方案,请对其进行评论post@Vikas如何投票评论?通过点击左侧箭头或注释,我找不到任何选项
    2020-09-18 20:40:56.985 10985-11347/com.example.learning E/ExoPlayerImplInternal: Source error
  com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: uri has query and/or fragment, which are not supported. Did you call Uri.parse() on a string containing '?' or '#'? Use Uri.fromFile(new File(path)) to avoid this. path=/storage/emulated/0/browser/,query=null,fragment=1 Django tutorials _ What is Django_ _ Python Web Framework.mp4
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:97)
    at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
    at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
    at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
    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: com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: uri has query and/or fragment, which are not supported. Did you call Uri.parse() on a string containing '?' or '#'? Use Uri.fromFile(new File(path)) to avoid this. path=/storage/emulated/0/browser/,query=null,fragment=1 Django tutorials _ What is Django_ _ Python Web Framework.mp4
    at com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:112)
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88)
    at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177) 
    at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83) 
    at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391) 
    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/browser: 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.openLocalFile(FileDataSource.java:108)
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88) 
    at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177) 
    at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83) 
    at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391) 
    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)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:288) 
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:151) 
    at com.google.android.exoplayer2.upstream.FileDataSource.openLocalFile(FileDataSource.java:108) 
    at com.google.android.exoplayer2.upstream.FileDataSource.open(FileDataSource.java:88) 
    at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177) 
    at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83) 
    at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391) 
    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)