web-dev-qa-db-fra.com

Comment construire un lecteur RSS pour Android?

Je suis nouveau sur Android et j'essaie de construire un lecteur RSS pour Android. J'ai construit toutes les classes et tous les fichiers XML mais cela ne donne pas la sortie requise. C'est juste montrer le message No RSS feed available.

S'il vous plaît, quelqu'un peut-il suggérer ce que je devrais faire?.

Voici le code que j'ai tiré du tutoriel et que j'ai essayé de manipuler -

public final String RSSFEEDOFCHOICE = "http://blog.01synergy.com/feed/";

public final String tag = "RSSReader";
private RSSFeed feed = null;

/** Called when the activity is first created. */

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    // go get our feed!
    feed = getFeed(RSSFEEDOFCHOICE);

    // display UI
    UpdateDisplay();

}


private RSSFeed getFeed(String urlToRssFeed)
{
    try
    {
        // setup the url
       URL url = new URL(urlToRssFeed);

       // create the factory
       SAXParserFactory factory = SAXParserFactory.newInstance();
       // create a parser
       SAXParser parser = factory.newSAXParser();

       // create the reader (scanner)
       XMLReader xmlreader = parser.getXMLReader();
       // instantiate our handler
       RSSHandler theRssHandler = new RSSHandler();
       // assign our handler
       xmlreader.setContentHandler(theRssHandler);
       // get our data via the url class
       InputSource is = new InputSource(url.openStream());
       // perform the synchronous parse           
       xmlreader.parse(is);
       // get the results - should be a fully populated RSSFeed instance, or null on error
       return theRssHandler.getFeed();
    }
    catch (Exception ee)
    {
        // if we have a problem, simply return null
        return null;
    }
}
public boolean onCreateOptionsMenu(Menu menu) 
{
    super.onCreateOptionsMenu(menu);

    menu.add(0,0,0, "Choose RSS Feed");
    menu.add(0,1,0, "Refresh");
    Log.i(tag,"onCreateOptionsMenu");
    return true;
}

public boolean onOptionsItemSelected(Menu item){
    switch (((View) item).getId()) {
    case 0:

        Log.i(tag,"Set RSS Feed");
        return true;
    case 1:
        Log.i(tag,"Refreshing RSS Feed");
        return true;
    }
    return false;
}


private void UpdateDisplay()
{
    TextView feedtitle = (TextView) findViewById(R.id.feedtitle);
    TextView feedpubdate = (TextView) findViewById(R.id.feedpubdate);
    ListView itemlist = (ListView) findViewById(R.id.itemlist);


    if (feed == null)
    {
        feedtitle.setText("No RSS Feed Available");
        return;
    }

    feedtitle.setText(feed.getTitle());
    feedpubdate.setText(feed.getPubDate());

    ArrayAdapter<RSSItem> adapter = new ArrayAdapter<RSSItem>(this,Android.R.layout.simple_list_item_1,feed.getAllItems());

    itemlist.setAdapter(adapter);

    itemlist.setOnItemClickListener(this);

    itemlist.setSelection(0);

}


 public void onItemClick(AdapterView parent, View v, int position, long id)
 {
     Log.i(tag,"item clicked! [" + feed.getItem(position).getTitle() + "]");

     Intent itemintent = new Intent(this,ShowDescription.class);

     Bundle b = new Bundle();
     b.putString("title", feed.getItem(position).getTitle());
     b.putString("description", feed.getItem(position).getDescription());
     b.putString("link", feed.getItem(position).getLink());
     b.putString("pubdate", feed.getItem(position).getPubDate());

     itemintent.putExtra("Android.intent.extra.INTENT", b);

     startSubActivity(itemintent,0);
 }


private void startSubActivity(Intent itemintent, int i) {
    // TODO Auto-generated method stub

}

}
16
Avi kumar

Vérifiez le lien suivant, c'est un lecteur RSS open source pour Android, vous pouvez télécharger le code pour référence

http://code.google.com/p/Android-rss/

5
Ketan Parmar

Ceci est ma première approche de RSS Reader, ce n’est pas si dynamique et a du code standard, mais a bien fonctionné pour moi.

Utilisation:

RssParser parser = new RssParser(feedUrl);
Log.i("LOG", "Description: " + parser.getItem(3).description); //4th item's description

Classe:

package com.uncocoder.course.app.feed_reader;

import Java.io.IOException;
import Java.net.URL;
import Java.util.ArrayList;
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 RssParser extends DefaultHandler {

    private StringBuilder   content;
    private boolean         inChannel;
    private boolean         inImage;
    private boolean         inItem;

    private ArrayList<Item> items   = new ArrayList<Item>();
    private Channel         channel = new Channel();

    private Item            lastItem;


    public RssParser(String url) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            URL sourceUrl = new URL(url);
            xr.setContentHandler(this);
            xr.parse(new InputSource(sourceUrl.openStream()));
        }
        catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        catch (SAXException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }


    public class Item {

        public String title;
        public String description;
        public String link;
        public String category;
        public String pubDate;
        public String guid;
    }


    public class Channel {

        public String title;
        public String description;
        public String link;
        public String lastBuildDate;
        public String generator;
        public String imageUrl;
        public String imageTitle;
        public String imageLink;
        public String imageWidth;
        public String imageHeight;
        public String imageDescription;
        public String language;
        public String copyright;
        public String pubDate;
        public String category;
        public String ttl;
    }


    @Override
    public void startDocument() throws SAXException {
        Log.i("LOG", "StartDocument");
    }


    @Override
    public void endDocument() throws SAXException {
        Log.i("LOG", "EndDocument");
    }


    @Override
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        if (localName.equalsIgnoreCase("image")) {
            inImage = true;
        }

        if (localName.equalsIgnoreCase("channel")) {
            inChannel = true;
        }

        if (localName.equalsIgnoreCase("item")) {
            lastItem = new Item();
            items.add(lastItem);
            inItem = true;
        }

        content = new StringBuilder();
    }


    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (localName.equalsIgnoreCase("image")) {
            inImage = false;
        }

        if (localName.equalsIgnoreCase("channel")) {
            inChannel = false;
        }

        if (localName.equalsIgnoreCase("item")) {
            inItem = false;
        }

        if (localName.equalsIgnoreCase("title")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.title = content.toString();
            } else if (inImage) {
                channel.imageTitle = content.toString();
            } else if (inChannel) {
                channel.title = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("description")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.description = content.toString();
            } else if (inImage) {
                channel.imageDescription = content.toString();
            } else if (inChannel) {
                channel.description = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("link")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.link = content.toString();
            } else if (inImage) {
                channel.imageLink = content.toString();
            } else if (inChannel) {
                channel.link = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("category")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.category = content.toString();
            } else if (inChannel) {
                channel.category = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("pubDate")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.pubDate = content.toString();
            } else if (inChannel) {
                channel.pubDate = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("guid")) {
            if (content == null) {
                return;
            }

            lastItem.guid = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("url")) {
            if (content == null) {
                return;
            }

            channel.imageUrl = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("width")) {
            if (content == null) {
                return;
            }

            channel.imageWidth = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("height")) {
            if (content == null) {
                return;
            }

            channel.imageHeight = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("language")) {
            if (content == null) {
                return;
            }

            channel.language = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("copyright")) {
            if (content == null) {
                return;
            }

            channel.copyright = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("ttl")) {
            if (content == null) {
                return;
            }

            channel.ttl = content.toString();
            content = null;
        }
    }


    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (content == null) {
            return;
        }

        content.append(ch, start, length);
    }


    public Item getItem(int index) {
        return items.get(index);
    }
}
11
Behnam

Il existe un tutoriel (y compris le code source complet) sur la création d'un réducteur Android RSS ici:

partie 1 (demande complète)

partie 2 (application mise à jour pour analyser les balises d'image de la description)

partie 3 (mise à jour d'application avec Android 3.0)

Le didacticiel utilise l’analyseur SAX et inclut un projet Android complet qui accède à un flux RSS et l’affiche ensuite sous forme de liste.

Cela semble toujours intéresser de nombreuses personnes. Si vous recherchez un Android 3.0+ avec des fragments/tâches asynchrones, etc., ainsi qu'un code d'application complet, j'ai de nouveau mis à jour les publications, et elles peuvent l'être. trouvé ici!

4
rhinds

Vous pouvez télécharger et consulter mon projet sur google-play . Ce projet concerne des flux de chaînes sportives turques. Beaucoup de canaux sont dans une application.

Vous pouvez vérifier le code source du projet sur github .

2
AknKplnoglu

Analyser ce type de flux RSS facilement en utilisant XmlPullParser

 Parse this type of Rss Feeds easily using <code>XmlPullParser</code>

     public class RSSParser {

public static ArrayList<Pojo> getParserData(String Data){
    try {
        RSSXMLTag currentTag = null;
        ArrayList<Pojo> postDataList = new ArrayList<>();
        XmlPullParserFactory factory = XmlPullParserFactory
                .newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(new StringReader(Data));

        int eventType = xpp.getEventType();
        Pojo pdData = null;
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "EEEE, DD MMM yyyy ");
        while (eventType != XmlPullParser.END_DOCUMENT) {
            int i = 0;
            if (eventType == XmlPullParser.START_DOCUMENT) {

            } else if (eventType == XmlPullParser.START_TAG) {
                if (xpp.getName().equals("item")) {

                    pdData = new Pojo();

                    currentTag = RSSXMLTag.IGNORETAG;
                } else if (xpp.getName().equals("title")) {
                    currentTag = RSSXMLTag.TITLE;
                } else if (xpp.getName().equals("link")) {
                    currentTag = RSSXMLTag.LINK;
                } else if (xpp.getName().equals("pubDate")) {
                    currentTag = RSSXMLTag.DATE;
                } else if (xpp.getName().equals("creator")) {

                    currentTag = RSSXMLTag.CREATOR;
                } else if (xpp.getName().equals("category")) {
                    currentTag = RSSXMLTag.CATEGORY;
                } else if (xpp.getName().equals("description")) {
                    currentTag = RSSXMLTag.DESCRIPTION;
                }
            } else if (eventType == XmlPullParser.END_TAG) {
                if (xpp.getName().equals("item")) {
                    // format the data here, otherwise format data in
                    // Adapter
                    Date postDate = dateFormat.parse(pdData.postDate);
                    pdData.postDate = dateFormat.format(postDate);
                    postDataList.add(pdData);
                } else {
                    currentTag = RSSXMLTag.IGNORETAG;
                }
            } else if (eventType == XmlPullParser.TEXT) {
                String content = xpp.getText();
                content = content.trim();
                Log.d("debug", content);
                if (pdData != null) {
                    switch (currentTag) {
                        case TITLE:
                            if (content.length() != 0) {
                                if (pdData.postTitle != null) {
                                    pdData.postTitle += content;
                                } else {
                                    pdData.postTitle = content;
                                }
                            }
                            break;
                        case LINK:
                            if (content.length() != 0) {
                                if (pdData.postLink != null) {
                                    pdData.postLink += content;
                                } else {
                                    pdData.postLink = content;
                                }
                            }
                            break;
                        case DATE:
                            if (content.length() != 0) {
                                if (pdData.postDate != null) {
                                    pdData.postDate += content;
                                } else {
                                    pdData.postDate = content;
                                }
                            }
                            break;
                        case CATEGORY:
                            if (content.length() != 0) {
                                if (pdData.postCategory != null) {
                                    i = i + 1;
                                    if (i == 1) {
                                        pdData.postCategory = content;
                                    }
                                } else {
                                    i = i + 1;
                                    if (i == 1) {
                                        pdData.postCategory = content;
                                    }
                                }
                            }
                            break;
                        case DESCRIPTION:
                            if (content.length() != 0) {
                                if (pdData.postDescription != null) {
                                    String s = content;

                                    String string = s.substring(s.indexOf("src=\"") + 5, s.indexOf("\" class=\""));
                                    pdData.postDescription += string;
                                } else {
                                    String s = content;

                                    String string = s.substring(s.indexOf("src=\"") + 5, s.indexOf("\" class=\""));
                                    pdData.postDescription = string;
                                }
                            }
                            break;
                        case CREATOR:
                            if (content.length() != 0) {
                                if (pdData.postCreator != null) {
                                    pdData.postCreator += content;
                                } else {
                                    pdData.postCreator = content;
                                }
                            }
                            break;
                        default:
                            break;
                    }
                }
            }

            eventType = xpp.next();
        }
        return postDataList;
    }catch (Exception e){
        e.printStackTrace();
    }

    return null;
}

public enum RSSXMLTag {
    IGNORETAG, TITLE, LINK, DATE,CREATOR,CATEGORY, DESCRIPTION;
}


public class Pojo {


public String getPostTitle() {
    return postTitle;
}

public void setPostTitle(String postTitle) {
    this.postTitle = postTitle;
}

public String getPostLink() {
    return postLink;
}

public void setPostLink(String postLink) {
    this.postLink = postLink;
}

public String getPostDate() {
    return postDate;
}

public void setPostDate(String postDate) {
    this.postDate = postDate;
}

public String getPostCategory() {
    return postCategory;
}

public void setPostCategory(String postCategory) {
    this.postCategory = postCategory;
}

public String getPostDescription() {
    return postDescription;
}

public void setPostDescription(String postDescription) {
    this.postDescription = postDescription;
}

public String getPostCreator() {
    return postCreator;
}

public void setPostCreator(String postCreator) {
    this.postCreator = postCreator;
}

public String postTitle;

public String postLink;

public String postDate;

public String postCategory;

public String postDescription;
public String postCreator;
}


}
0
Aman Jham