Android 将SimpleXoPlayer与房间一起用作脱机缓存
在我的Android应用程序项目中,当用户未连接到网络时,我希望允许从脱机缓存播放视频。出于这个原因,我使用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
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)