Last.fm无法返回艺术家图片

3

我正在尝试从Last.fm获取并应用艺术家图片到一个ImageView,但是没有任何图片被返回。我不确定我在这里做错了什么。

private void setLastFmArtistImage() {

    try {
        String imageurl = "http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist="
                + URLEncoder.encode("Andrew Bird")
                + "&api_key="
                + APIKEY
                + "&limit=" + 1 + "&page=" + 1;
        InputStream in = null;

        Log.i("URL", imageurl);
        URL url = new URL(imageurl);
        URLConnection urlConn = url.openConnection();

        HttpURLConnection httpConn = (HttpURLConnection) urlConn;

        httpConn.connect();

        in = httpConn.getInputStream();

        Bitmap bmpimg = BitmapFactory.decodeStream(in);
        mArtistBackground.setImageBitmap(bmpimg);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

需要更多的细节...如果没有返回图像,那么返回的是什么?这些都是你需要分析的基本调试内容。 - JoxTraex
没有返回任何东西,我已经提到了。什么也没有改变。 - adneal
当然会返回一些东西,但是它是XML格式的,而不是图片。 - Jens
如果它是一个XML,则必须解析XML以检索链接:D - JoxTraex
@adneal,你的项目完成了吗?我有问题要问。请在回复中标记我。 - Ankit Srivastava
显示剩余3条评论
1个回答

6
你想使用的API返回的是XML,不是图像。您需要解析响应并从响应中选择适当的图像URL。 API文档非常详细,查看每个人最喜欢的艺术家Benny Hill的示例响应,将为您提供足够的方向以找到合适的图像进行显示。 编辑:您可以查看官方Last.fm客户端的API示例-请注意,这是GPL3许可的内容,除非您愿意发布源代码,否则不要过多地复制和粘贴。 再次编辑:要查看未受污染的示例,请尝试以下内容:

(该示例使用友好的XML解析器JSoup

public List<LastFmImage> getLastFmImages(String artistName, int limit, int page) throws IOException {
    String apiUrl = "http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist="
            + URLEncoder.encode(artistName)
            + "&api_key="
            + APIKEY
            + "&limit=" + limit + "&page=" + page;

    Document doc = Jsoup.connect(apiUrl).timeout(20000).get();
    Elements images = doc.select("images");

    ArrayList<LastFmImage> result = new ArrayList<LastFmImage>();
    final int nbrOfImages = images.size();
    for (int i = 0; i < nbrOfImages; i++) {
        Element image = images.get(i);
        String title = image.select("title").first().text();
        Elements sizes = image.select("sizes").select("size");
        final int nbrOfSizes = sizes.size();
        for (int j = 0; j < nbrOfSizes; j++) {
            Element size = sizes.get(i);

            result.add(new LastFmImage(title, size.text(),
                    size.attr("name"),
                    Integer.parseInt(size.attr("width")),
                    Integer.parseInt(size.attr("height"))));
        }
    }
    return result;
}

还有LastFmImage类:

public class LastFmImage {
    public String mTitle;
    public String mUrl;
    public String mName;
    public int mWidth;
    public int mHeight;

    public LastFmImage(String title, String url, String name, int width, int height) {
        mTitle = title;
        mUrl = url;
        mName = name;
        mWidth = width;
        mHeight = height;
    }
}

我已经阅读了API文档,现在它们也打开着。我想我的问题是我不知道如何从XML中检索图像。感谢你的提示。我其实正在尝试避免复制粘贴。我真的想学会如何做到这一点。 - adneal
下载XML并分析它,这应该相当明显。 - JoxTraex
@Jens 您的示例非常有帮助。这是我第一次解析XML,所以我不可能再多要求了。谢谢,我很感激。我仍然不太明白如何设置位图,但我相信我会弄清楚的。 - adneal
嗯,LastFmImage # mUrl 将包含一个 URL,您可以使用之前的方法加载(例如使用 HttpUrlConnection 获取)。 - Jens
嘿,这个有没有涉及到任何法律问题?而且你提供的链接似乎是错误的(关于last fm文档),这就是我问这个愚蠢问题的原因。 - Ankit Srivastava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接