我正在使用exoplayer 2从网络上播放音乐。现在我想使用beautifulSimpleCache类缓存下载的音乐。我的问题是:每当我请求播放一首歌时,服务器都会返回一个不同的url(对于同一首歌也是如此),它被SimpleCache用作键。因此,SimpleCache为每个url创建一个新的缓存文件(也就是,为同一首歌创建一个不同的文件)。
如果有办法问我为特定url生成的缓存文件的键是什么,那就太好了。你知道怎么做吗?
SimpleCache类是final,因此我不能重写它的方法。
编辑,一个粗略的解决方案:
我创建了一个CacheDataSource的副本,并在open(DataSpec)方法中更改了这一行,该方法负责密钥的生成:

key = dataSpec.key != null ? dataSpec.key : uri.toString();

由于一些uri的参数,我可以生成相同的密钥,这些参数等于为同一首歌检索的每个url。这个解决方案解决了我的问题,但并不是所有可能的情况下都那么通用和可利用。
CacheDataSource已按照this comment中的说明使用:
private DataSource.Factory buildDataSourceFactory(final boolean useBandwidthMeter) {
    return new DataSource.Factory() {
        @Override
        public DataSource createDataSource() {
            LeastRecentlyUsedCacheEvictor evictor = new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024);
            SimpleCache simpleCache = new SimpleCache(new File(getCacheDir(), "media_cache"), evictor);
            return new CacheDataSource(
                simpleCache,
                buildMyDataSourceFactory(useBandwidthMeter).createDataSource(),
                CacheDataSource.FLAG_BLOCK_ON_CACHE,
                10 * 1024 * 1024
            );
        }
    };
}

private DefaultDataSource.Factory buildMyDataSourceFactory(boolean useBandwidthMeter) {
    return new DefaultDataSourceFactory(PlayerActivity.this, userAgent, useBandwidthMeter ? BANDWIDTH_METER : null);
}

最佳答案

自从exoplayer 2.10.0以来,它被添加了ProgressiveMediaSource类,取代了ExtractorMediaSource(已经被弃用)。
使用progressivemediasource的Factory类创建progressivemediasource时,可以调用方法setCustomCacheKey(String)
它正是我所需要的!

08-15 23:50