我正在使用通用映像加载程序来显示从URI下载的图像或已在磁盘缓存实施中可用的图像。基于本地文件名的通用映像加载程序自定义FileNameGenerator
我想要显示音乐专辑封面,但多个曲目可能具有相同的封面URI(即来自同一专辑的曲目)。我希望即使图像是相同的,每次为每个不同的曲目存储曲目名称也是如此,因为我希望用户能够使用自定义的曲目替换默认封面,即使对于每个单曲都是如此。
例如
- 01 - 轨道01.mp3
- 02 - 轨道02.mp3
属于同一个专辑,封面URI是http://something/img.jpg
,在磁盘缓存我想要
- 01 - Track 01.jpg
- 02 - Track 02.jpg
即使它是相同的图像。
所以我编码了一个FileNameGenerator
,它为每个Uri
存储一个Set
散列,其中散列是文件绝对路径的SHA-1。
这是我实现:
public MyFileNameGenerator(String ext) {
super();
this.ext = ext;
}
HashMap<String,HashSet<String>> names = new HashMap<String, HashSet<String>>();
@Override
public String generate(String imageUri) {
if(imageUri==null) return null;
if (imageUri.startsWith("file:///")) {
return FilenameUtils.removeExtension(Uri.parse(imageUri)
.getLastPathSegment()) + "."+ext;
}
//How to recognize the correct hash?
//return FilenameUtils.removeExtension(Data.currentFiles
// .get(names.get(imageUri)).getName()) + "." + ext;
}
public void setTrackData(String uri, String hash) {
if(!names.containsKey(uri))
names.put(uri, new HashSet<String>());
names.get(uri).add(hash);
}
但我在一个死胡同,因为它不可能了解哪些文件,我显示图像,作为生成只需要imageURI作为参数,并更哈希可以属于同一个uri。
我怎么能绕过这个问题?
这对我来说并不是很清楚,所以你需要将track_name.mp3作为散列的关键字,并将track_name.jpg作为值?如果是这种情况,只需将album_name添加到密钥[album_name_terack_name.mp3 = track_name.jpg],这样就可以区分具有相同名称的曲目,并且具有相同的值是没有问题的 – Yazan 2014-10-28 09:24:03
@Yazan no。两个不同的文件可以具有相同的图像uri(即相同的专辑封面),我为每个uri存储一组哈希值,哈希值为mp3文件的绝对路径的SHA1,以便我知道给定的uri被某些文件使用。当调用生成它应该返回的MP3名称,但与PNG扩展名。但是由于'generate'只将uri作为参数,我怎么知道我显示的是哪个文件?换句话说,相同的URI应该根据我显示封面的文件加载不同的图像。 – Vektor88 2014-10-28 09:30:24
好的,为什么不用另一种方式呢?使用track_name.mp3作为键,这样,哈希可以是相同的(它具有相同的图像),除非用户改变了图像,以便名为(track_name.mp3)的条目将具有新的哈希(图像) – Yazan 2014-10-28 09:34:37