Porting JavaME apps to Android is easier with J2ME Polish
Great news for JavaME developers! The J2ME Polish project has announced that their upcoming j2mepolish 2.1 toolkit suite will support porting JavaME apps to Google Android mobile platform automatically! This means that the current JavaME developers will enjoy the advantages of porting their existing mobile application to Android effortlessly.

According to their press release, the next j2mepolish release will focus on automating the process of converting JavaME MIDlets to iPhone application.
J2ME Polish 2.1: Android support?

Currently I’ve yet to see how a ported JavaME application would look like on an Android mobile phone, but hopefully it would be as good as the ordinary Google Android app. At this time of this writing, J2ME Polish 2.1 is only available as a preview release which can be downloaded from J2ME Polish website.
I’ll update this blog about this feature once J2ME Polish 2.1 has been released.
p/s: I’m Eager to know how a JavaME app will look like once its ported to Android.
JavaME JSR-179 Example Code : Detect Location via TinyGeocoder
I've completed the JSR-179 Location API code for reverse geocoding in JavaME. This code essentially is an expansion of the previous JSR-179 example that i've posted in the blog before, plus the Reverse-Geocoding feature, thanks to TinyGeocoder service.

What this sample MIDlet does?
It obtain coordinates via the mobile phone JSR-179 Location API and subsequently display the name of the location using TinyGeocoder reverse geocoding service.
-
import javax.microedition.midlet.*;
-
import javax.microedition.lcdui.*;
-
import javax.microedition.location.*;
-
import javax.microedition.io.*;
-
import javax.microedition.location.*;
-
import java.io.*;
-
-
public class Geocoder extends MIDlet implements CommandListener
-
{
-
public Display display;
-
public Form form;
-
private Command cmdExit,cmdOK;
-
public StringItem si, sili;
-
-
public Geocoder()
-
{
-
-
display =Display.getDisplay(this);
-
form = new Form("Location Api test");
-
cmdExit = new Command("Exit",Command.EXIT,5);
-
cmdOK = new Command("OK",Command.OK,1);
-
si = new StringItem("Coordinates", "Press OK");
-
sili = new StringItem("Location", "");
-
form.append(si);
-
form.append(sili);
-
form.addCommand(cmdOK);
-
form.addCommand(cmdExit);
-
form.setCommandListener(this);
-
}
-
-
public void startApp()
-
{
-
display.setCurrent(form);
-
}
-
-
-
public void pauseApp()
-
{}
-
-
public void destroyApp(boolean flag) {
-
notifyDestroyed();
-
}
-
-
public void commandAction(Command c, Displayable d)
-
{
-
if (c == cmdOK){
-
Retriever ret = new Retriever(this);
-
ret.start();
-
-
} else if (c == cmdExit) {
-
destroyApp(false);
-
}
-
}
-
-
{
-
si.setText(string);
-
}
-
-
Alert alert = new Alert("Alert",message,null,AlertType.WARNING);
-
display.setCurrent(alert,form);
-
}
-
-
-
-
-
}
-
-
-
private Geocoder midlet;
-
Form formRunning;
-
Gauge gauge;
-
-
-
-
public Retriever(Geocoder midlet)
-
{
-
/**
-
* Constructor
-
*
-
* EFFECTS: Initialise the server and store midlet information
-
*
-
* @param midlet The main application midlet
-
* @param server Forecast Server URL
-
*
-
*/
-
this.midlet = midlet;
-
formRunning = new Form("Retrieving Info");
-
formRunning.append(new Gauge("Processing",false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING));
-
midlet.display.setCurrent(formRunning);
-
-
}
-
-
public void run()
-
{
-
/**
-
* Entry point of the thread
-
*
-
* EFFECTS: call to connect() method
-
*/
-
try {
-
checkLocation();
-
{
-
ex.printStackTrace();
-
midlet.displayString(ex.toString());
-
} finally {
-
-
}
-
-
-
}
-
-
{
-
String string;
-
Location l;
-
LocationProvider lp;
-
Coordinates c;
-
// Set criteria for selecting a location provider:
-
// accurate to 500 meters horizontally
-
Criteria cr= new Criteria();
-
cr.setHorizontalAccuracy(5000);
-
cr.setVerticalAccuracy(5000);
-
-
// Get an instance of the provider
-
lp= LocationProvider.getInstance(cr);
-
-
// Request the location, setting a one-minute timeout
-
l = lp.getLocation(120);
-
c = l.getQualifiedCoordinates();
-
-
if(c != null ) {
-
// Use coordinate information
-
double lat = c.getLatitude();
-
double lon = c.getLongitude();
-
string = "\nLatitude : " + lat + "\nLongitude : " + lon;
-
new GetData(midlet,lat,lon).start();
-
-
} else {
-
string ="Location API failed";
-
}
-
-
formRunning.append("Obtained coordinates...");
-
midlet.displayString(string);
-
}
-
}
-
-
-
Geocoder midlet;
-
double lat, lon;
-
-
public GetData (Geocoder midlet, double lat, double lon) {
-
-
this.lat = lat;
-
this.lon = lon;
-
this.midlet = midlet;
-
-
-
}
-
-
public void commandAction (Command cmd,Displayable disp)
-
{
-
-
}
-
-
public void start() {
-
t.start();
-
}
-
-
-
public void run() {
-
HttpConnection conn=null;
-
InputStream is=null;
-
String sb;
-
-
try {
-
conn = (HttpConnection) Connector.open(sUrl,Connector.READ);
-
if (conn.getResponseCode() == HttpConnection.HTTP_OK) {
-
is = conn.openInputStream();
-
byte buf[] = new byte[128];
-
int total =0;
-
while (total <128) {
-
int count = is.read(buf,total,128-total);
-
if (count<0) {
-
break;
-
}
-
total += count;
-
}
-
-
-
if (sb.length() <10) {
-
midlet.showAlert("Connection error, please try again");
-
is.close();
-
conn.close();
-
-
return;
-
}
-
-
midlet.sili.setText(sb);
-
//midlet.form.append(sb);
-
//vectorized();
-
//midlet.saveCurrency(false,midlet.vector);
-
//midlet.display.setCurrent(midlet.form);
-
} else if (conn.getResponseCode() == HttpConnection.HTTP_NOT_FOUND) {
-
midlet.showAlert("URL not found");
-
-
} else {
-
midlet.showAlert("Server busy or unavailable. Please try again later");
-
}
-
-
midlet.showAlert("Connection failed. You need to authorize this application to access network");
-
midlet.showAlert("Connection failed. Please try again later.");
-
midlet.showAlert(e.toString());
-
e.printStackTrace();
-
//midlet.display.setCurrent(midlet.form);
-
} finally {
-
try {
-
if (is != null) {
-
is.close();
-
}
-
-
if (conn != null) {
-
conn.close();
-
}
-
is =null;
-
conn =null;
-
midlet.display.setCurrent(midlet.form);
-
-
-
}
-
}
-
-
-
{
-
if (s!=null) {
-
int i=0;
-
try {
-
while (true) {
-
int b = (int)s.charAt(i++);
-
if ((b>=0x30 && b<=0x39) || (b>=0x41 && b<=0x5A) || (b>=0x61 && b<=0x7A)) {
-
tmp.append((char)b);
-
}
-
else {
-
tmp.append("%");
-
if (b <= 0xf) tmp.append("0");
-
}
-
}
-
}
-
return tmp.toString();
-
}
-
return null;
-
}
-
}
The code requires mobile device which implements JSR-179 Location API and has been tested on Nokia E71 and 6210 Navigator.
Tags: coordinates, e71, example, geocoder, geocoding, gps, j2me, javame, jsr-179, jsr179, lbs, location-api, locationapi, midlet, midlets, mobile, Nokia, source code, tinygeocoder
TinyGeo-coder : A cool free geocoding/reverse geocoding service
I was searching for a free and easy to use geocoding web service over the internet for my experiment involving Location Based Service (LBS). Then suddenly i came accross tinygeocoder, a web service which really suits my need.
tinygeocoder services that caught my eye :
- geocoding - you can feed it with name of place like "San Francisco, CA" and it will return result in latitude and longitude pair "(37.775196,-122.419204)"
- reverse geocoding - feed it with a coordinate, and the service will return you the name of the corresponding place.
Personally I like the "reverse geocoding" functionality more as it would be handy for my LBS project. Keep an eye for this blog as I'll be posting JavaME JSR-179 (Location API) codes which utilizes tinygeocoder services.
p/s: If you find tinygeoder helpful, consider making donations to them.
Tags: api, codes, example, geo coding, geocoder, geocoding, gps, lbs, location, location-api, maps, mobile, REST, web, Web Service
Kirodict – a Compact, Lightweight JavaME mobile dictionary
Finally after spending a couple months working on this on and off personal project, I decided to release the final version of Kirodict - a lightweight mobile dictionary.
As it name implies, Kirodict was designed to be small in size while maintaining its functionality as a fully fledge dictionary for mobile and embedded device. Kirodict acts as a front-end to an RFC2229 (dict.org) compatible server which it obtain the word definition from.

Its small and compact size as well as its portability makes it an attractive application to be downloaded and installed on your mobile phone. Kirodict requires mobile phones with at least these feature :
- MIDP 2.0 /CLDC 1.0 compatible phones
- 128kB of free storage space
- Phone with network connection (3G, GPRS, Wifi, wimax)
With lower requirements, it can be installed on a lower end phone without much problem. Kirodict does not use additional storage space as it does not cache its results.
Kirodict can be downloaded from Kirodict Google Code project website and it is licensed under the GNU General Public License version 2.0
Google Android Phone Kogan Agora delayed?
Probably a stale news for most of you, the touted second Google Android Phone on the market, Kogan Agora product has been canceled despite having received huge pre-orders. The official statement from Kogan Technologies website states that the Kogan Agora release is delayed indefinitely citing technical issues regarding is screen size and resolution.
Kogan Agora, estimated to be available by Christmas 2008, might not even be ready by this year (2009). Customer who pre-ordered Kogan is being refunded as this article were written.

Its a pity to see such affordable Google Android phone to be delayed indefinitely, while there are a lot of phone manufacturers behind Open Handset Alliance (OHA, the organization that backed Android), we have yet to see other Google Android phone surfaces besides HTC manufactured T-Mobile G1.
As for my personal opinion, I don't think Android platform is worth investing in right now since the only supported Android phone in the market is the SIM-locked T-Mobile, and although there has been news that Motorola, Huawei and Sony Ericsson are preparing to release Android phone, I don't think I will give in much hope for Android until I've seen on the shelf of my local mobile phone store (SIM-unlocked, just like normal phones that is)
Primosync: Synchronize Google Calendar with Mobile Phone

This week, I've tried Primosync, a JavaME application which allows you to synchronize your Calendar, Events and activities with Google Calendar.
Primosync is compatible with mobile phone which supports JavaME JSR-75 PIM API, a feature that becoming common in latest modern phones.
Advantages of syncing phone calendar with Google Calendar :
- You will be able to access your event, activities and reminders anywhere with internet connection
- Your events and reminder will be more portable across various phone models as you can sync it with Google Calendar to update your Calendar
- Easier to keep track of your reminder and events
- As a backup measure in case if your mobile phone is stolen or lost
You can download it from Primosync Google Code project website (yes it is open source!) or from Primosync.mobi download site (mobile phone friendly). Available in 3 versions (Blackberry, JavaME Signed, JavaME Unsigned), for some reasons, I was unable to install the Signed version of Primosync in my E71. So I figure the Unsigned version might work in more phones.
So lets start syncing!
Tags: calendar, j2me, Java, javame, jsr-75, mobile, mobile phone, PDA, sync, synchronization, synchronize