2012-01-13 12 views
0

hei guys。私はAndroidプログラミングではかなり新しいです。私はインターネットから入手したチュートリアルを使ってウェブサイトからRSSフィードを取得しようとしています。しかし、私は、希望のウェブサイトのIDにURLを変更すると、プログラムは何も表示されず、このエラーが表示されます。android rssフィードリーダーエラー(リダイレクトが多すぎる)

01-13 17:09:30.251: ERROR/RSS Handler IO(277): Too many redirects >> java.net.ProtocolException: Too many redirects 

はここにここに私のRSSHandler.javaコード

package com.tmm.android.rssreader.util; 

import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

import android.util.Log; 


public class RSSHandler extends DefaultHandler { 

// Feed and Article objects to use for temporary storage 
private Article currentArticle = new Article(); 
private List<Article> articleList = new ArrayList<Article>(); 

// Number of articles added so far 
private int articlesAdded = 0; 

// Number of articles to download 
private static final int ARTICLES_LIMIT = 20; 

//Current characters being accumulated 
StringBuffer chars = new StringBuffer(); 


/* 
* This method is called everytime a start element is found (an opening XML marker) 
* here we always reset the characters StringBuffer as we are only currently interested 
* in the the text values stored at leaf nodes 
* 
* (non-Javadoc) 
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) 
*/ 
public void startElement(String uri, String localName, String qName, Attributes atts) { 
    chars = new StringBuffer(); 
} 



/* 
* This method is called everytime an end element is found (a closing XML marker) 
* here we check what element is being closed, if it is a relevant leaf node that we are 
* checking, such as Title, then we get the characters we have accumulated in the StringBuffer 
* and set the current Article's title to the value 
* 
* If this is closing the "Item", it means it is the end of the article, so we add that to the list 
* and then reset our Article object for the next one on the stream 
* 
* 
* (non-Javadoc) 
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String) 
*/ 
public void endElement(String uri, String localName, String qName) throws SAXException { 

    if (localName.equalsIgnoreCase("title")) 
    { 
     Log.d("LOGGING RSS XML", "Setting article title: " + chars.toString()); 
     currentArticle.setTitle(chars.toString()); 

    } 
    else if (localName.equalsIgnoreCase("description")) 
    { 
     Log.d("LOGGING RSS XML", "Setting article description: " + chars.toString()); 
     currentArticle.setDescription(chars.toString()); 
    } 
    else if (localName.equalsIgnoreCase("pubDate")) 
    { 
     Log.d("LOGGING RSS XML", "Setting article published date: " + chars.toString()); 
     currentArticle.setPubDate(chars.toString()); 
    } 
    else if (localName.equalsIgnoreCase("encoded")) 
    { 
     Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString()); 
     currentArticle.setEncodedContent(chars.toString()); 
    } 
    ////////////////// 
    else if(localName.equalsIgnoreCase("fh:FlightHistory")) 
    { 
     Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString()); 
     currentArticle.setFhFlightHistory(chars.toString()); 
    } 
    else if(localName.equalsIgnoreCase("fh:Airline")) 
    { 
     Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString()); 
     currentArticle.setFhAirline(chars.toString()); 
    } 
    //////////////////// 
    else if (localName.equalsIgnoreCase("item")) 
    { 

    } 
    else if (localName.equalsIgnoreCase("link")) 
    { 

     try { 
      System.out.println(chars.toString()); 
      Log.d("LOGGING RSS XML", "Setting article link url: " + chars.toString()); 
      currentArticle.setUrl(new URL(chars.toString())); 
     } catch (MalformedURLException e) { 
      Log.e("RSA Error", e.getMessage()); 
      e.printStackTrace(); 
     } 

    } 




    // Check if looking for article, and if article is complete 
    if (localName.equalsIgnoreCase("item")) { 

     articleList.add(currentArticle); 

     currentArticle = new Article(); 

     // Lets check if we've hit our limit on number of articles 
     articlesAdded++; 
     if (articlesAdded >= ARTICLES_LIMIT) 
     { 
      throw new SAXException(); 
     } 
    } 
} 





/* 
* This method is called when characters are found in between XML markers, however, there is no 
* guarante that this will be called at the end of the node, or that it will be called only once 
* , so we just accumulate these and then deal with them in endElement() to be sure we have all the 
* text 
* 
* (non-Javadoc) 
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) 
*/ 
public void characters(char ch[], int start, int length) { 
    chars.append(new String(ch, start, length)); 
} 





/** 
* This is the entry point to the parser and creates the feed to be parsed 
* 
* @param feedUrl 
* @return 
*/ 
public List<Article> getLatestArticles(String feedUrl) { 
    URL url = null; 
    try { 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 

     url = new URL(feedUrl); 

     xr.setContentHandler(this); 
     xr.parse(new InputSource(url.openStream())); 


    } catch (IOException e) { 
     Log.e("RSS Handler IO", e.getMessage() + " >> " + e.toString()); 
    } catch (SAXException e) { 
     Log.e("RSS Handler SAX", e.toString()); 
    } catch (ParserConfigurationException e) { 
     Log.e("RSS Handler Parser Config", e.toString()); 
    } 

    return articleList; 
} 

} 

してください、任意の答えであるとはあまり理解されるであろう示唆私RSSReader.javaページ

/** 
* 
*/ 
package com.tmm.android.rssreader.reader; 

import java.util.ArrayList; 
import java.util.List; 

import org.json.JSONException; 
import org.json.JSONObject; 

import android.text.Html; 
import android.util.Log; 

import com.tmm.android.rssreader.util.Article; 
import com.tmm.android.rssreader.util.RSSHandler; 

/** 
* @author rob 
* 
*/ 
public class RssReader { 

private final static String BOLD_OPEN = "<B>"; 
private final static String BOLD_CLOSE = "</B>"; 
private final static String BREAK = "<BR>"; 
private final static String ITALIC_OPEN = "<I>"; 
private final static String ITALIC_CLOSE = "</I>"; 
private final static String SMALL_OPEN = "<SMALL>"; 
private final static String SMALL_CLOSE = "</SMALL>"; 

/** 
* This method defines a feed URL and then calles our SAX Handler to read the article list 
* from the stream 
* 
* @return List<JSONObject> - suitable for the List View activity 
*/ 
public static List<JSONObject> getLatestRssFeed(){ 
    //String feed = "http://globoesporte.globo.com/dynamo/futebol/times/vasco/rss2.xml"; 
    String feed = "http://www.flightstats.com/go/rss/flightStatusByRoute.do?guid=34b64945a69b9cac:-420d81e6:134c55649d7:-21c5&departureCode=cgk&arrivalCode=sub&departureDate=2012-01-13"; 
    RSSHandler rh = new RSSHandler(); 
    List<Article> articles = rh.getLatestArticles(feed); 
    Log.e("RSS ERROR", "Number of articles " + articles.size()); 
    return fillData(articles); 
} 


/** 
* This method takes a list of Article objects and converts them in to the 
* correct JSON format so the info can be processed by our list view 
* 
* @param articles - list<Article> 
* @return List<JSONObject> - suitable for the List View activity 
*/ 
private static List<JSONObject> fillData(List<Article> articles) { 

    List<JSONObject> items = new ArrayList<JSONObject>(); 
    for (Article article : articles) { 
     JSONObject current = new JSONObject(); 
     try { 
      buildJsonObject(article, current); 
     } catch (JSONException e) { 
      Log.e("RSS ERROR", "Error creating JSON Object from RSS feed"); 
     } 
     items.add(current); 
    } 

    return items; 
} 


/** 
* This method takes a single Article Object and converts it in to a single JSON object 
* including some additional HTML formating so they can be displayed nicely 
* 
* @param article 
* @param current 
* @throws JSONException 
*/ 
private static void buildJsonObject(Article article, JSONObject current) throws JSONException { 
    String title = article.getTitle(); 
    String description = article.getDescription(); 
    String date = article.getPubDate(); 
    String imgLink = article.getImgLink(); 

    StringBuffer sb = new StringBuffer(); 
    sb.append(BOLD_OPEN).append(title).append(BOLD_CLOSE); 
    sb.append(BREAK); 
    sb.append(description); 
    sb.append(BREAK); 
    sb.append(SMALL_OPEN).append(ITALIC_OPEN).append(date).append(ITALIC_CLOSE).append(SMALL_CLOSE); 

    current.put("text", Html.fromHtml(sb.toString())); 
    current.put("imageLink", imgLink); 
} 
} 

です。 :)

答えて

0

ほとんどの場合、ユーザーエージェント関連の問題です。

私が見ている限り、あなたが呼んでいるサイトにはモバイル向けの特別なバージョンがあり、モバイルユーザーエージェントを使用していることが検出された場合はRSSフィードを提供しません。

おそらくそれを変更する必要があります。

+0

しかし、私はRSSプロバイダに依頼しており、彼らはすでに自分のフィードを使用する許可を私に与えています。 RSSフィードを表示する方法はありますか?ありがとうございました –

関連する問題