Android 将SimpleXoPlayer与房间一起用作脱机缓存

Android 将SimpleXoPlayer与房间一起用作脱机缓存,android,android-room,repository-pattern,offline-caching,exoplayer2.x,Android,Android Room,Repository Pattern,Offline Caching,Exoplayer2.x,在我的Android应用程序项目中,当用户未连接到网络时,我希望允许从脱机缓存播放视频。出于这个原因,我使用Repository模式和Room持久性库构建了这个应用程序,正如官方的googlecodelabs所推荐的那样 问题是,当用户未连接到internet时,尽管视频项目存储在房间数据库表中,但视频不会播放 从我的Logcat输出中,我可以看到以下错误消息: 2020-03-21 16:26:55.132 25186-25246/com.celik.abdullah.mylim6 E/Exo

在我的Android应用程序项目中,当用户未连接到网络时,我希望允许从脱机缓存播放视频。出于这个原因,我使用
Repository
模式和
Room
持久性库构建了这个应用程序,正如官方的googlecodelabs所推荐的那样

问题是,当用户未连接到internet时,尽管视频项目存储在
房间
数据库表中,但视频不会播放

从我的
Logcat
输出中,我可以看到以下错误消息:

2020-03-21 16:26:55.132 25186-25246/com.celik.abdullah.mylim6 E/ExoPlayerImplInternal: Source error.
    com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to http://192.***.**.***:8000/media/Videos/2020-03-16-12-26-49-268_CzixOFI.mp4
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:293)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:938)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:394)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)
     Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
        at java.net.Socket.connect(Socket.java:586)
        at com.android.okhttp.internal.Platform.connectSocket(Platform.java:113)
        at com.android.okhttp.Connection.connectSocket(Connection.java:1455)
        at com.android.okhttp.Connection.connect(Connection.java:1413)
        at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1700)
        at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:133)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:466)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:371)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:503)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:130)
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:561)
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:448)
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:291)
我假设
ExoPlayer
试图通过相应的URL连接到Web服务以获取视频。因此,我认为我的
ExoPlayer
设置有点错误。 我的
ExoPlayer
设置如下:

playerView.player = ExoPlayerFactory.newSimpleInstance(
        playerView.context,
        DefaultTrackSelector())
        .apply {
            prepare(
                ProgressiveMediaSource.Factory(DefaultHttpDataSourceFactory("exoplayer-codelab"))
                    .createMediaSource(Uri.parse(videoString)), true, false)
            playWhenReady = true
        }
videoString
(ExoPlayer正试图连接到该字符串)是存储在
Room
中的特定视频项目的URL。我如何重构它,以便
ExoPlayer
可以使用缓存的视频?可能吗

为了完整起见,下面是
Video.kt
实体类:

@JsonClass(generateAdapter = true)
@Entity(tableName = "video_table")
data class Video(
    @PrimaryKey
    @Json(name = "id")
    val videoId: Long,
    val title: String?,
    val text:String?,
    val video: String?,    // <--- that string is hold by videoString variable u have seen above
)
@JsonClass(generateAdapter=true)
@实体(tableName=“video\u table”)
数据类视频(
@主键
@Json(name=“id”)
长,
val标题:字符串?,
val文本:字符串?,

val video:String?,//我不确定,但看起来您只是将一个url保存到数据库中的视频(存储在web的某个位置)。这种情况下,如果没有网络连接,它将无法工作。 在这种情况下,好的方法是:

1-将视频本地保存在设备上,为此,您可以使用此库:

2-将加载视频的实体保存到数据库,但使用本地保存文件的路径作为url(视频字段)

3-从数据库获取数据后,在此代码段中将本地文件路径用作videoString字段:

 .apply {
        prepare(
            ProgressiveMediaSource.Factory(DefaultHttpDataSourceFactory("exoplayer-codelab"))
                .createMediaSource(Uri.parse(videoString)), true, false)