Проблемы с ExoPlayer при попытке загрузить текущий трек

Я использую Exoplayer для создания собственного музыкального проигрывателя. Я также добавляю возможность загрузки трека, но у меня возникает проблема, когда я пытаюсь загрузить трек, который играю. Я добавляю уведомление в загрузку, чтобы проверить ход загрузки, и оно появляется, но даже не начинается. Я думаю, что у него могут быть какие-то проблемы с кешем буферизации и загрузкой, поскольку они хранятся в одной папке.

Чтобы скачать треки, я делаю следующее:

override fun addDownloadTrack(track: Track) {
    getIfTrackIsCached.run({ isCached ->
                               if (!isCached) {
                                   val data = Util.toByteArray(track.title.byteInputStream())
                                   val downloadRequest =
                                       DownloadRequest(track.id, DownloadRequest.TYPE_PROGRESSIVE, Uri.parse(track.href), Collections.emptyList(), track.id, data)
                                   DownloadService.sendAddDownload(context, ExoPlayerDownloadService::class.java, downloadRequest, false)
                               }
                           }, ::onError, GetIfTrackIsCached.Params(track.id))
}

Это DownloadService:

class ExoPlayerDownloadService : DownloadService(
        FOREGROUND_NOTIFICATION_ID,
        DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL,
        Constants.CHANNEL_DOWNLOAD_ID,
        R.string.exo_download_notification_channel_name) {

    private val manager: DownloadManager by inject()
    private val channelIsCached: ChannelPublisher<CachedMedia> by inject(PUBLISHER_IS_CACHED)
    private val notificationHelper: DownloadNotificationHelper by inject()

    private var nextNotificationId: Int = FOREGROUND_NOTIFICATION_ID

    override fun onCreate() {
        super.onCreate()
        if (!manager.isInitialized) {
            manager.maxParallelDownloads = MAX_PARALLEL_DOWNLOADS
        }
    }

    override fun getDownloadManager(): DownloadManager = manager

    override fun getForegroundNotification(downloads: MutableList<Download>?): Notification {
        var text = ""
        var index = 1
        downloads?.forEach { text += "${if (downloads.size > 1) "${index++} - " else ""}${Util.fromUtf8Bytes(it.request.data)}\n" }
        return notificationHelper.buildProgressNotification(R.drawable.ic_stat_downloading, null, text, downloads)
    }

    override fun getScheduler(): Scheduler? = null

    override fun onDownloadChanged(download: Download?) {
        val notification = when (download?.state) {
            Download.STATE_COMPLETED -> {
                channelIsCached.publish(CachedMedia(download.request.id, true))
                notificationHelper.buildDownloadCompletedNotification(R.drawable.ic_stat_download_complete, null, Util.fromUtf8Bytes(download.request.data))
            }
            Download.STATE_FAILED ->
                notificationHelper.buildDownloadFailedNotification(R.drawable.ic_stat_download_failed, null, Util.fromUtf8Bytes(download.request.data))
            else -> null
        }
        notification?.let { NotificationUtil.setNotification(this@ExoPlayerDownloadService, ++nextNotificationId, it) }
    }

    companion object {

        private const val MAX_PARALLEL_DOWNLOADS = 3
        private const val FOREGROUND_NOTIFICATION_ID = 2000
    }
}

И для создания кеша я использую это:

SimpleCache(File(androidContext().cacheDir, CACHE_MEDIA_FOLDER), NoOpCacheEvictor(), get<DatabaseProvider>()) 

Как избежать конфликтов между кешем буферизации и загружаемыми файлами?


person Iban Arriola    schedule 28.08.2019    source источник


Ответы (1)


У меня тоже была эта проблема, и я нашел решение! В документации по загрузке указано

CacheDataSource.Factory следует настроить как доступный только для чтения, чтобы избежать загрузки этого содержимого во время воспроизведения.

Для этого вы должны вызвать setCacheWriteDataSinkFactory(null) для вашего объекта CacheDataSource.Factory.

Это предотвратит запись потока в кеш, позволяя загрузчику записывать, как ожидалось.

person Sam Le-Cornu    schedule 04.01.2021