2014-10-28 23 views
0

我正在使用通用映像加载程序来显示从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。

我怎么能绕过这个问题?

+0

这对我来说并不是很清楚,所以你需要将track_name.mp3作为散列的关键字,并将track_name.jpg作为值?如果是这种情况,只需将album_name添加到密钥[album_name_terack_name.mp3 = track_name.jpg],这样就可以区分具有相同名称的曲目,并且具有相同的值是没有问题的 – Yazan 2014-10-28 09:24:03

+0

@Yazan no。两个不同的文件可以具有相同的图像uri(即相同的专辑封面),我为每个uri存储一组哈希值,哈希值为mp3文件的绝对路径的SHA1,以便我知道给定的uri被某些文件使用。当调用生成它应该返回的MP3名称,但与PNG扩展名。但是由于'generate'只将uri作为参数,我怎么知道我显示的是哪个文件?换句话说,相同的URI应该根据我显示封面的文件加载不同的图像。 – Vektor88 2014-10-28 09:30:24

+0

好的,为什么不用另一种方式呢?使用track_name.mp3作为键,这样,哈希可以是相同的(它具有相同的图像),除非用户改变了图像,以便名为(track_name.mp3)的条目将具有新的哈希(图像) – Yazan 2014-10-28 09:34:37

回答

0

我想我已经找到了解决方案。

每当我打电话给我的ImageLoader实例显示的图像,我用

if (uri != null && !uri.isEmpty()) { 
    uri = Uri.parse(uri).buildUpon() 
     .appendQueryParameter("myhashkeyparameter", "myHashValue").toString(); 
} 
mImageLoader.displayImage(uri,mImageView); 

此代码将追加到vaild URI查询参数,该URI将变为:

http://someuri/image.jpg?myhashkeyparameter=myHashValue 

然后在FileNameGeneratorgenerate我可以使用的方法

String hash = Uri.parse(imageUri).getQueryParameter("myhashkeyparameter"); 

检索想要的文件,而不依赖于使用imageUri作为关键。

全码:

@Override 
public String generate(String imageUri) { 
    if(imageUri==null||imageUri.isEmpty()) return ""; 
    if (imageUri.startsWith("file:///")) { 
     return FilenameUtils.removeExtension(Uri.parse(imageUri) 
       .getLastPathSegment()) + "."+ext; 
    } 
    String hash = Uri.parse(imageUri).getQueryParameter("myhashkeyparameter"); 
    if(null==hash||hash.isEmpty()) return ""; 
    if(Data.currentFiles.containsKey(hash)){ 
    return FilenameUtils.removeExtension(Data.currentFiles.get(hash).getName())+".png"; 
    } 
    else return ""; 
} 

你必须要小心的是,用作queryparameter的字符串不是在HTTP URL已被使用,所以避免这样的名字,哈希,H,标题传统的名称和等等。

相关问题