【问题标题】:Last.fm won't return artist imageLast.fm 不会返回艺术家图像
【发布时间】:2012-01-25 07:31:22
【问题描述】:

我正在尝试从 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();
    }
}

【问题讨论】:

  • 需要更多细节......如果没有返回图像......那么返回的是什么?这些是您需要分析的基本调试内容。
  • 没有返回任何东西,我提到了这一点。没有任何变化。
  • 没有数据返回?如果您转到该链接,它会在浏览器上返回任何内容吗?
  • 还有,能不能成功把图片改成本地图片? mArtistBackground.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.id.image));
  • ofc 的东西被返回.. 但它是 XML,而不是图像。

标签: java android bitmap last.fm


【解决方案1】:

您尝试使用的 API 返回 XML,不是图像。您需要解析响应并从响应中选择适当的图像 URL。

API documentation 非常详尽,查看每个人最喜欢的艺术家Benny Hill 的示例响应将为您提供足够的方向来找到合适的图像来显示。

编辑:有关 API 的示例,您可以查看官方 Last.fm client - 但请注意,这是 GPL3 许可的东西,除非您想发布源代码,否则您不应该这样做玩太多复制和粘贴。

编辑(再次):对于不受 GPL3污染的示例,试试这个:

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

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 中检索图像。谢谢你的提示。我实际上是在尝试避免复制和粘贴。我真的很想学习如何做到这一点。
  • 下载XML并分析它应该很明显。
  • @Jens 您的示例非常有帮助。这是我第一次解析 XML,所以我不能要求更多。谢谢你,我很感激。我仍然不太明白我是如何设置位图的,但我相信我会弄明白的。
  • 好吧,LastFmImage#mUrl 将包含一个您可以使用以前的方法实际加载的 URL(例如,使用 HttpUrlConnection 获取)。
  • 嘿,这是否涉及任何法律问题?您提供的链接似乎已损坏(最后一个 fm 文档),这就是我问这个愚蠢问题的原因
猜你喜欢
  • 2015-12-11
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多