我正在J2ME开发基于GPS的应用程序。我是Google API编码的新手。当我命令一个接一个地映射,例如向上,向下,缩放,缩小时,Google Static Map API会在此代码中显示以下错误 - inputStream = connection.openInputStream();
:
java.io.IOException:没有可用的响应条目
空
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)
此错误的含义是什么?我该怎么解决? Plz帮助我..因为这个问题我一直在这里...
我的连接代码如下:
//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();
}
}
我按照说法开发了代码,但问题仍然存在。代码是
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());
}
}
我的完整谷歌地图代码如下 -
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);
}
}
答案 0 :(得分:1)
以下是我将如何调试此内容:
1。首先,请确保复制整个网址字符串(包括我无法仔细检查的坐标和API密钥),然后将网址粘贴到桌面浏览器。首先,确保您可以通过这种方式检索图像。如果没有,您的网址就不好了。
2. 如果步骤(1)有效,我会尝试使用几种方法检查您的请求状态:
connection = (HttpConnection)Connector.open(url);
connection.setRequestMethod(HttpConnection.GET);
if (connection.getResponseCode() == HttpConnection.HTTP_OK) { // check HTTP code
inputStream = connection.openInputStream();
int len = (int) connection.getLength();
if (len > 0) { // check content length
map = Image.createImage(inputStream);
确保HTTP响应代码看起来正常,并且流打开,产生正内容长度。根据您显示的堆栈跟踪,您的代码可能无法进行长度检查,但它可能是有用的调试...并且可能存在多个问题。
3。如果您仍然遇到困难,可以尝试an alternate implementation of the code to retrieve a URL and load it into an Image
object。请注意,此方法中的流和连接是 local 变量,因此可以在方法结束后的某个时间进行垃圾回收。
private Image getImage(String url) throws IOException
{
ContentConnection connection = (ContentConnection) Connector.open(url);
DataInputStream iStrm = connection.openDataInputStream();
ByteArrayOutputStream bStrm = null;
Image im = null;
try
{
// ContentConnection includes a length method
byte imageData[];
int length = (int) connection.getLength();
if (length != -1)
{
imageData = new byte[length];
// Read the png into an array
iStrm.readFully(imageData);
}
else // Length not available...
{
bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = iStrm.read()) != -1)
bStrm.write(ch);
imageData = bStrm.toByteArray();
bStrm.close();
}
// Create the image from the byte array
im = Image.createImage(imageData, 0, imageData.length);
}
finally
{
// Clean up
if (iStrm != null)
iStrm.close();
if (connection != null)
connection.close();
if (bStrm != null)
bStrm.close();
}
return (im == null ? null : im);
}
更新:,请查看at this Nokia J2ME documentation for using the REST Maps API。记下这个警告:
这里重点是确保所有连接都是 无论请求成功与否,都会关闭。没有 做这个基本的内务处理导致连接失败后a 少数请求“无响应条目可用”错误。曾经 收到图像后,它将作为静态图像保存在im Object中。
因此,如果您要保留原始代码,请务必在finally
块中执行此操作:
finally {
try {
if (inputStream != null)
inputStream.close();
if (connection != null)
connection.close();
} catch (Exception ex) {
ex.printStackTrace();
}