Last.fm не возвращает изображение исполнителя

Я пытаюсь получить и применить изображение исполнителя из 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();
    }
}

person adneal    schedule 25.01.2012    source источник
comment
требуется более подробная информация... Если изображение не возвращается... тогда ЧТО возвращается? Это основные вещи отладки, которые вам нужно проанализировать.   -  person JoxTraex    schedule 25.01.2012
comment
Ничего не возвращается, я упоминаю об этом. Ничего не меняется.   -  person adneal    schedule 25.01.2012
comment
данные не возвращаются? если вы перейдете по этой ссылке, она что-нибудь вернет в браузере?   -  person JoxTraex    schedule 25.01.2012
comment
Кроме того, вы можете успешно изменить изображение на локальное изображение? mArtistBackground.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.id.image));   -  person dokkaebi    schedule 25.01.2012
comment
материал ofc возвращается ... но это XML, а не изображение.   -  person Jens    schedule 25.01.2012
comment
Да, ImageView работает как надо. Я могу изменить его на любой местный.   -  person adneal    schedule 25.01.2012
comment
если это XML, то вам нужно проанализировать XML... чтобы получить ссылку: D   -  person JoxTraex    schedule 25.01.2012
comment
@adneal ты уже закончил свой проект? у меня есть вопросы..пожалуйста, отметьте меня в своем ответе   -  person Ankit Srivastava    schedule 26.11.2013


Ответы (1)


API, который вы пытаетесь использовать, возвращает XML, не изображение. Вам необходимо проанализировать ответ и выбрать соответствующий URL-адрес изображения из ответа.

Документация по API довольно подробна, и, просмотрев образец ответа для каждого любимого исполнителя, Бенни Хилл даст вам достаточно указаний, чтобы найти подходящее изображение для отображения.

Изменить: пример API можно найти на официальном сайте Last.fm. клиент - будьте осторожны, это материал под лицензией 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;
    }
}
person Jens    schedule 25.01.2012
comment
Я просмотрел документы API, они у меня открыты прямо сейчас. Я предполагаю, что моя проблема в том, что я не знаю, как получить изображение из XML. Спасибо за совет. Я на самом деле пытаюсь избежать копирования и вставки. Я действительно хочу научиться делать это. - person adneal; 25.01.2012
comment
Загрузите XML и проанализируйте его, и он должен быть довольно очевидным. - person JoxTraex; 25.01.2012
comment
@Jens Ваш пример чрезвычайно полезен. Это мой первый раз, когда я разбираю XML, поэтому я не мог просить большего. Спасибо, я ценю это. Я до сих пор не совсем понимаю, как я устанавливаю растровое изображение, но я уверен, что разберусь. - person adneal; 25.01.2012
comment
Что ж, LastFmImage#mUrl будет содержать URL-адрес, который вы можете загрузить, используя предыдущий подход (например, с помощью HttpUrlConnection). - person Jens; 25.01.2012
comment
Эй, есть ли какие-либо юридические проблемы, связанные с этим? - person Ankit Srivastava; 12.08.2013