I am Developing GPS based app in J2ME . I am new in the Google API coding. When I give command to map one after another for example Up, Down, zoom, zoom-out the Google Static Map API gives me the Following error at this code - inputStream = connection.openInputStream(); :
java.io.IOException: No Response Entries Available
null
at com.sun.midp.io.InternalConnector.openPrim(+157)
at com.sun.midp.io.InternalConnector.openInternal(+9)
at com.sun.midp.io.j2me.http.Protocol.connect_wap(+210)
at com.sun.midp.io.j2me.http.Protocol.connect(+107)
at com.sun.midp.io.j2me.http.Protocol.openInputStream(+64)
at midletgps.GoogleMaps.run(GoogleMaps.java:90)
What is the meaning of this error & how should I resolved that?? Plz help me.. I stucked here because of this problem...
My connection code is as follows :
//the query string for the Google service
String url = "http://maps.google.com/maps/api/staticmap?center=";
url += latitude + "," + longitude;
url += "&zoom=" + String.valueOf(zoom);
url += "&size=" + width + "x" + height + "&maptype=hybrid" +"&sensor=true" + "&key=API key";
try
{
connection = (HttpConnection)Connector.open(url);
connection.setRequestMethod(HttpConnection.GET);
inputStream = connection.openInputStream();
map = Image.createImage(inputStream);
setImage(map);
iserror=false;
repaint();
midGPS.displayMap();
}
catch (Exception ex)
{
iserror=true;
ex.printStackTrace();
}
finally
{
try
{
if (connection != null)
{
connection.close();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
I developed a code the way said but problem is still persist.. Code is
String url = "http://maps.googleapis.com/maps/api/staticmap?center=";
url += latitude + "," + longitude;
url += "&zoom=" + String.valueOf(zoom);
url += "&size=" + width + "x" + height + "&maptype=hybrid" +"&sensor=true" + "&key=API key";
try
{
Image logo = null;
byte[] imagedata;`
connection = (ContentConnection)Connector.open(url);
inputStream = connection.openDataInputStream();
int len = (int) connection.getLength();
if(len != -1)
{
imagedata = new byte[len];
//get the image into byte
inputStream.readFully(imagedata);
}
else //length not available
{
byteArray = new ByteArrayOutputStream();
int c;
while ((c = inputStream.read()) != -1)
{
byteArray.write(c);
}
imagedata = byteArray.toByteArray();
byteArray.close();
}
//create an Image object
logo = Image.createImage(imagedata, 0, imagedata.length);
setImage(logo);
iserror=false;
repaint();
midGPS.displayMap();
}
catch (Exception ex)
{
iserror=true;
ex.printStackTrace();
//showError("Error message : " + ex.getMessage());
}
finally
{
try
{
if (connection != null)
{
connection.close();
}
if (inputStream != null)
{
inputStream.close();
}
if (byteArray != null)
{
connection.close();
}
}
catch (Exception ex)
{
showError("Error message : " + ex.getMessage());
}
}
My complete code for google maps as follows -
public class GoogleMaps extends Canvas implements CommandListener, Runnable
{
//get the width and the height of the screen
int width = getWidth();
int height = getHeight();
Image map;
Command cmdBack = new Command("Back", Command.EXIT, 1);
Command cmdRefresh = new Command("Refresh", Command.SCREEN, 1);
MidletGPS midGPS; //reference to the parent MIDlet
int zoom = 17;
String latitude = "";
String longitude = "";
ContentConnection connection = null;
DataInputStream inputStream = null;
ByteArrayOutputStream byteArray = null;
Thread t;
boolean iserror = true;
Alert error;`
public GoogleMaps(MidletGPS mGPS, String Lat, String Longit)
{
//only for testing
latitude = "19.021531";
longitude = "72.848432";
//latitude = Lat;
//longitude = Longit;
midGPS = mGPS;
this.addCommand(cmdBack);
this.addCommand(cmdRefresh);
this.setCommandListener(this);
runThread();
}
public void runThread()
{
t = new Thread(this);
t.start();
}
public void setImage(Image image)
{
map = image;
}
public void paint(Graphics g)
{
//Paints only, if the search succeeded in returning a location
if(!iserror)
{
g.drawImage(map, width/2, height/2, Graphics.HCENTER | Graphics.VCENTER);
}
}
public void commandAction(Command c, Displayable d)
{
if (c == cmdBack)
{
midGPS.setCurrentForm(midGPS.mainForm);
}
if (c == cmdRefresh)
{
runThread();
this.repaint();
}
}
public void run()
{
//the query string for the Google service
String url = "http://maps.googleapis.com/maps/api/staticmap?center=";
url += latitude + "," + longitude;
url += "&zoom=" + String.valueOf(zoom);
url += "&size=" + width + "x" + height + "&maptype=hybrid" +"&sensor=true" + "&key=API KEY";
try
{
Image logo = null;
byte[] imagedata;
connection = (ContentConnection)Connector.open(url);
if(inputStream.read() != -1)
{
inputStream = connection.openDataInputStream();
}
else
{
}
int len = (int) connection.getLength();
if(len != -1)
{
imagedata = new byte[len];
//get the image into byte
inputStream.readFully(imagedata);
}
else //length not available
{
byteArray = new ByteArrayOutputStream();
int c;
while ((c = inputStream.read()) != -1)
{
byteArray.write(c);
}
imagedata = byteArray.toByteArray();
byteArray.close();
}
//create an Image object
logo = Image.createImage(imagedata, 0, imagedata.length);
setImage(logo);
iserror=false;
repaint();
midGPS.displayMap();
}
catch (Exception ex)
{
iserror=true;
ex.printStackTrace();
//showError("Error message : " + ex.getMessage());
}
finally
{
try
{
if (connection != null)
{
connection.close();
}
if (inputStream != null)
{
inputStream.close();
}
if (byteArray != null)
{
byteArray.close();
}
}
catch (Exception ex)
{
showError("Error message : " + ex.getMessage());
}
}
}
protected void keyPressed(int keyCode)
{
if (((char) keyCode) == '1')
{
zoom--;
}
if (((char) keyCode) == '3')
{
zoom++;
}
//if you want to move the map in all directions
double offset = 0.02;
if (getGameAction(keyCode) == 5)
{
double lon = (Double.parseDouble(longitude));
lon += offset / zoom;
longitude = String.valueOf(lon);
}
if (getGameAction(keyCode) == 2)
{
double lon = (Double.parseDouble(longitude));
lon -= offset / zoom;
longitude = String.valueOf(lon);
}
if (getGameAction(keyCode) == 4)
{
double lat = (Double.parseDouble(latitude));
lat += offset / zoom;
latitude = String.valueOf(lat);
}
if (getGameAction(keyCode) == 6)
{
double lat = (Double.parseDouble(latitude));
lat -= offset / zoom;
latitude = String.valueOf(lat);
}
// re-Call connection thread
runThread();
//call the paint event
//this.repaint();
}
void showError(String message)
{
error = new Alert("Error", message, null, AlertType.ERROR);
error.setTimeout(error.getDefaultTimeout());
Display.getDisplay(midGPS).setCurrent(error, midGPS.mainForm);
}
}
getImage()method I suggested multiple times? How often are you doing this? Once a second? Once a minute? If you're doing this in a loop, then please show that loop, too.connectionandinputStreammember variables. I would not recommend doing that. Make them local variables in the method that uses them. Also, you should include some protection so that if a map request is running (run()is running), then another user action should either cancel the current request, or wait until the current request ends. As the code is now, you can have concurrent requests, which probably isn't good.