我的应用程序的一部分是构建一个导航方向字符串,然后尝试解析JSON并在我的地图上绘制折线路线。我首先使用位置变量或区域设置常量来构建我的字符串,最终得到类似以下的内容:
https://maps.googleapis.com/maps/api/directions/json?origin=Full Frame Documentary Film
Festival, Durham, 27701&destination=601 W Peace St, Raleigh,27605&sensor=false&key={API_KEY}
- 这里没有换行(为了可读性我加了一个),{API_KEY}是我的实际api密钥。
我遇到的问题是,当我把这个URL字符串传递给downloadUrl(String urlString)方法时,会出现问题。
private String downloadUrl(String urlString) throws IOException {
Log.d(TAG, "Downloaded string = " + urlString);
String data = "";
InputStream stream = null;
HttpURLConnection urlConnection = null;
try {
// Display our JSON in our browser (to show us how we need to implement our parser)
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(urlString));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
URL url = new URL(urlString);
// Create a http connection to communicate with url
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
// read in our data
stream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
StringBuffer sb = new StringBuffer();
// read in our data in, and append it as a single data string
String line = "";
while ((line = br.readLine()) != null) {
Log.d(TAG,"url download stream: " + line);
sb.append(line);
}
data = sb.toString();
br.close();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
Log.d(TAG, "Downloaded data = " + data);
stream.close();
urlConnection.disconnect();
}
return data;
}
JSON在我的浏览器中正确显示,我看到了Google文档中描述的一切内容。但是,在接下来的几行代码中,当我尝试打开与URL的连接并将JSON拉入字符串进行解析时,我收到了System.err通知。
05-02 09:56:01.540: W/System.err(32232): java.io.FileNotFoundException:
https://maps.googleapis.com/maps/api/directions/json?origin=Full Frame Documentary
Film Festival, Durham, 27701&destination=601 W Peace St, Raleigh, 27605&sensor=false&key={API_KEY}
我的困惑在于浏览器可以完美显示解析后的地址,但是连接到(我认为是)同一台服务器时返回一个 FNFE。我是否错误地假设了这种情况?如果是这样,我的密钥可能真的是错的吗?令人困惑的是,这段代码在另一个应用程序中是有效的。
AsyncTask
或类似工具。 - hgoeblgetInputStream()
返回响应之前,调用urlConnection.getResponseCode()
。在HTTP状态码为4xx
和5xx
的情况下,调用getInputStream()
会抛出异常,如果你对错误响应的主体感兴趣,你必须调用getErrorStream()
。 - hgoebl