是否有关于如何序列化/存储ExoPlayer MediaItem的指南?有两个原因,
-
在两台设备之间传递以共享播放列表,以及
-
用于存储在本地数据库中以缓存播放列表。
或者MediaItem在与ExoPlayer实例交互时是一个纯粹短暂的对象吗?我应该使用自己的域模型对象吗?我目前没有自己的域对象,因为我正在尝试使用ExoPlayer类型作为此功能的API。
首先,通过网络共享,我最终使用Parcelable和Bundle来存储它们,但对象是巨大的。
val count = map.getInt("count")
val parcel = Parcel.obtain()
return try {
(0 until count).mapNotNull {
val feedItemBytes = map.getByteArray("feed.$it")
feedItemBytes?.let {
parcel.setDataPosition(0)
parcel.unmarshall(feedItemBytes, 0, feedItemBytes.size)
parcel.setDataPosition(0)
val bundle = Bundle.CREATOR.createFromParcel(parcel)
val fromBundle = MediaItem.CREATOR.fromBundle(bundle)
fromBundle.buildUpon()
.setUri(fromBundle.mediaMetadata.mediaUri)
.build()
}
}
} finally {
parcel.recycle()
}
第二种方法是存储到数据库中,最后我将自己的数据对象存储在Room和转换器中。
fun toMediaItem(): MediaItem {
val metadataBuilder = MediaMetadata.Builder()
.setTitle(title)
.setDisplayTitle(title)
.setArtist(artist)
.setMediaUri(Uri.parse(mediaUrl))
if (artworkUrl != null) {
metadataBuilder.setArtworkUri(Uri.parse(artworkUrl))
}
return MediaItem.fromUri(mediaUrl)
.buildUpon()
.setMediaId(mediaId!!.toString())
.setMediaMetadata(metadataBuilder.build())
.build()
}
companion object {
fun MediaItem.toMediaAppItem(): MediaAppItem {
val mediaId = this.mediaId.toIntOrNull()
val mediaUrl = this.mediaMetadata.mediaUri?.toString()!!
val artworkUrl = this.mediaMetadata.artworkUri?.toString()
val title = this.mediaMetadata.title?.toString()
val artist = this.mediaMetadata.albumArtist?.toString()
val album = this.mediaMetadata.albumTitle?.toString()
return MediaAppItem(mediaId = mediaId, mediaUrl = mediaUrl, artworkUrl = artworkUrl, title = title, artist = artist, album = album)
}
}