Monday 22 October 2012

Nokia(j2me) RssFeed(XML) Reader Application using LCDUI(UserInterface API)

This article will helps you to develope  an RssFeed Reader (XML) for Nokia Mobile.
If you run this Application Initially, you will be able to display a (LCDUI User Interface)List Screen.

On this List Screen you will be displayed with an Image as well as a title from Rss-xml file.Moreover,if you click on any List Item you will be Navigate to a Form Screen.

You can Check the Complete Code Below:
Package Structure:


RssMidlet  Class:


import java.util.Vector;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

public class RssMidlet extends MIDlet implements CommandListener {
    private Display myDysplay;
    private List rssList;
    private Vector rssItem;
    private Command cmdExit, cmdDetails;
    private Command m_backCommand;      // The back to header list command
    private Form form;         // The item form
    private RssModel model;
    public RssMidlet() {
        rssItem= new Vector();
        form=new Form("FormScreen");
       
        myDysplay = Display.getDisplay(this);
        m_backCommand = new Command("Back", Command.SCREEN, 1);
        form.addCommand(m_backCommand);
        rssList = new List("RssListScreen", List.IMPLICIT);
        cmdExit = new Command("EXIT", Command.EXIT, 1);
        cmdDetails = new Command("Details", Command.SCREEN, 2);
        rssList.addCommand(cmdExit);
        rssList.addCommand(cmdDetails);
       }
   
                 public void startApp() {
        // XML file url
        String url = "Rss File Here";
        form.setCommandListener(this);
        rssList.setCommandListener(this);
        ParseThread myThread = new ParseThread(this);
        //this will start the second thread
        myThread.getXMLFeed(url);
        Display.getDisplay(this).setCurrent(rssList);
       }
        public void pauseApp() {
        }
        public void destroyApp(boolean unconditional) {
       }
     
public void commandAction(Command command, Displayable displayable) {
        /**
         * Get back to RSS feed headers
         */
        if (command == m_backCommand) {
            myDysplay.setCurrent(rssList);
        }
        if (command == cmdExit) {
            destroyApp(false);
            notifyDestroyed();
        } else if (command == cmdDetails || command == List.SELECT_COMMAND) {
            //get the index of the selected title
            int index = rssList.getSelectedIndex();
            if (index != -1) {
                           Display.getDisplay(this).setCurrent(form);     
            }
             
             
        }
    }
    //method called by the parsing thread
    public void addItems(RssModel model) {
        rssItem.addElement(rssItem);
       
        rssList.append(model.getTitle(), model.getImage());
     
        myDysplay.setCurrent(rssList);
    }
    public void DisplayError(Exception error) {
        Alert errorAlert = new Alert("Error", error.getMessage(), null, null);
        errorAlert.setTimeout(Alert.FOREVER);
        myDysplay.setCurrent(errorAlert, rssList);
    }
}

ParseThread:
import org.kxml2.io.*;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.Image;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParser;
              public class ParseThread {
    protected RssMidlet parentMidlet;
    private String imageurl;
    private Image image;
    private String readUrl;
    private String srcUrl;
    public ParseThread(RssMidlet parent) {
        parentMidlet = parent;
    }
    public void getXMLFeed(final String url) {
        Thread t = new Thread() {
            public void run() {
                HttpConnection myConnection = null;
                try {
                    myConnection = (HttpConnection) Connector.open(url);
                    InputStream stream = myConnection.openInputStream();
                    ParseXMLFeed(stream);
                } catch (Exception error) {
                    parentMidlet.DisplayError(error);
                } finally {
                    try {
                        if (myConnection != null) {
                            myConnection.close();
                        }
                    } catch (IOException eroareInchidere) {
                        parentMidlet.DisplayError(eroareInchidere);
                    }
                }
            }
        };
        t.start();
    }
             private void ParseXMLFeed(InputStream input) throws IOException, XmlPullParserException {
        System.out.println("ParseXMLFeed");
        Reader dataReader = new InputStreamReader(input);
        KXmlParser myParser = null;
        try {
            myParser = new KXmlParser();
        } catch (Exception e) {
            //System.out.println("hiiii" + e);
        }
        myParser.setInput(dataReader);

        myParser.nextTag();
        myParser.require(XmlPullParser.START_TAG, null, "rss");
        myParser.nextTag();
        myParser.require(XmlPullParser.START_TAG, null, "channel");
        myParser.nextTag();
        myParser.require(XmlPullParser.START_TAG, null, "title");
        while (myParser.getEventType() != XmlPullParser.END_DOCUMENT) {
            String name = myParser.getName();
            if (name.equals("channel")) {
                break;
            }
            if (name.equals("item")) {
                if (myParser.getEventType() != XmlPullParser.END_TAG) {
                    myParser.nextTag();
                    String title = myParser.nextText();
                    System.out.println("Title" + title);
                    myParser.nextTag();
                    String link = myParser.nextText();
                    System.out.println("Link" + link);
                    myParser.nextTag();
                    String pubDate = myParser.nextText();
                    myParser.nextTag();
                    String ptext = myParser.nextText();//(<p>some text</p>)
                    System.out.println("PTEXT>>>" + ptext);
                            //Image src Value from ptext  
                    if (ptext.indexOf("src") != -1) {
                        int pTagIndex = ptext.indexOf("p");
                        int srcIndex1 = ptext.indexOf("src", pTagIndex);
                        int httpIndex1 = ptext.indexOf("/", srcIndex1);
                        int quotesIndex1 = ptext.indexOf("\"", httpIndex1);
                        srcUrl = ptext.substring(httpIndex1, quotesIndex1);
                        System.out.println("srcUrl " + srcUrl);
                        boolean containsWhitespace = srcUrl.trim().indexOf(" ") != -1;
                        if (containsWhitespace == true) {
                            displayDefaultImage();

                        } else {
                            //imageurl = "http://www...." + srcUrl;
                         
                            ImageClass ic = new ImageClass();
                            image = ic.getImage(parentMidlet, srcUrl.trim());
                        }

                    } else {
                        System.out.println("Default");
                        displayDefaultImage();
                    }
                    //check imagesrc contains any whitespace characters or not
                    RssModel model = new RssModel(title, image);
                    parentMidlet.addItems(model);
                    }
                     } else {
                     myParser.skipSubTree();
                      }
                    myParser.nextTag();
                       }
                    input.close();
                    }
                    private void displayDefaultImage() {
                 try {
                  image = Image.createImage("/res/logo.png");
              } catch (IOException ex) {
                 ex.printStackTrace();
                  }
                  }
                  }
ImageClass: it will return the image class reference


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.io.DataInputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Image;
/**
 *
 * @author welcome
 */
public class ImageClass {
    private RssMidlet parentMidlet;
    private DataInputStream is = null;
    private Image img = null;
    private Display display;
    public Image getImage(RssMidlet parentMidlet, String imageurl) {
        this.parentMidlet = parentMidlet;
        display = Display.getDisplay(parentMidlet);
        try {
            HttpConnection c = (HttpConnection) Connector.open(imageurl);
            int len = (int) c.getLength();
            if (len > 0) {
                is = c.openDataInputStream();
                byte[] data = new byte[len];
                is.readFully(data);
                img = Image.createImage(data, 0, len);
                //img=createThumbnail(img);
            } else {
                showAlert("length is null");
            }
            is.close();
            c.close();
        } catch (Exception e) {
            e.printStackTrace();
            showAlert(e.getMessage());
        }
        return img;
        }
       private void showAlert(String err) {
        Alert a = new Alert("");
        a.setString(err);
        a.setTimeout(Alert.FOREVER);
        display.setCurrent(a);
         }
         }


RssModel Class:

import javax.microedition.lcdui.Image;
public class RssModel {
    private String title;
    private Image image;
    public RssModel(String Title,Image image) {
        title = Title;
        this.image = image;
    }
    public String getTitle() {
        return title;
    }
   
    public Image getImage() {
        return image;
    }
 
    }








No comments:

Post a Comment