web-dev-qa-db-ja.com

Android用のRSSリーダーを構築するには?

私はAndroid=を初めて使用し、Android用のRSSリーダーを構築しようとしています。すべてのクラスとXMLファイルを構築しましたが、必要な出力を提供していません。メッセージNo RSS feed available

誰かが私が何をすべきかを提案できますか?.

これは私がチュートリアルから取って操作しようとしたコードです-

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

以下のリンクをチェックしてください。これはAndroid向けのオープンソースのRSSリーダーです。参照用にコードをダウンロードできます

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

5
Ketan Parmar

これはRSSリーダーへの私の最初のアプローチです。それほど動的ではなく、ボイラープレートコードがありますが、私自身はうまく機能しました。

使用法:

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

クラス:

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);
    }
}
12
Behnam

Android RSS reder hereの作成方法に関するチュートリアル(完全なソースコードを含む)があります:

パート1(完全なアプリケーション)

パート2(説明からイメージタグを解析するために更新されたアプリケーション)

パート3(Android 3.0)を使用したアプリケーションの更新)

このチュートリアルではSAXパーサーを使用し、RSSフィードにアクセスしてフィードをリストビューに表示する完全なAndroid=プロジェクトが含まれています。

まだ多くの人がこれに興味を持っているようです-したがって、Android 3.0+、および完全なアプリケーションコードを探している場合は、再び投稿し、 彼らはここで見つけることができます!

4
rhinds

google-play で私のプロジェクトをダウンロードして確認できます。このプロジェクトは、いくつかのトルコのスポーツチャンネルのフィードについてです。多くのチャネルが1つのアプリケーションにあります。

プロジェクトのソースコードは github で確認できます。

2
AknKplnoglu

XmlPullParserを使用して、このタイプのRssフィードを簡単に解析します

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