2
我正在嘗試利用Google地理編碼API。我似乎無法解決由於「查詢中的非法字符」導致應用程序崩潰的問題。Google地理編碼API - 查詢中存在非法字符
堆棧跟蹤
10-18 17:13:57.986: E/AndroidRuntime(15822): FATAL EXCEPTION: main
10-18 17:13:57.986: E/AndroidRuntime(15822): Process: com.huddly.main, PID: 15822
10-18 17:13:57.986: E/AndroidRuntime(15822): java.lang.IllegalArgumentException: Illegal character in query at index 63: https://maps.googleapis.com/maps/api/geocode/json?address=Union Beach, NJ, United States&sensor=true
10-18 17:13:57.986: E/AndroidRuntime(15822): at java.net.URI.create(URI.java:727)
10-18 17:13:57.986: E/AndroidRuntime(15822): at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
10-18 17:13:57.986: E/AndroidRuntime(15822): at com.huddly.main.CreateSportEventFragmentActivity.getLatLongFromAddress(CreateSportEventFragmentActivity.java:289)
10-18 17:13:57.986: E/AndroidRuntime(15822): at com.huddly.main.CreateSportEventFragmentActivity.onClick(CreateSportEventFragmentActivity.java:431)
這裏是我複製,從這裏在另一個帖子裏被打上「已接受」粘貼代碼的樣本。響應
private static final String GEOCODING_API_BASE = "https://maps.googleapis.com/maps/api/geocode";
private static final String OUT_JSON = "/json";
public static void getLatLongFromAddress(String address) {
StringBuilder sb = new StringBuilder(GEOCODING_API_BASE + OUT_JSON);
sb.append("?address=" + address);
//sb.append("&key=" + API_KEY);
sb.append("&sensor=false");
String uri = sb.toString();
HttpGet httpGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject = new JSONObject(stringBuilder.toString());
double lng = ((JSONArray) jsonObject.get("results"))
.getJSONObject(0).getJSONObject("geometry")
.getJSONObject("location").getDouble("lng");
double lat = ((JSONArray) jsonObject.get("results"))
.getJSONObject(0).getJSONObject("geometry")
.getJSONObject("location").getDouble("lat");
Log.e("latitude", "" + lat);
Log.e("longitude", "" + lng);
} catch (JSONException e) {
e.printStackTrace();
}
}
堆棧跟蹤JOOP埃根
10-18 18:27:33.307: E/AndroidRuntime(27343): FATAL EXCEPTION: main
10-18 18:27:33.307: E/AndroidRuntime(27343): Process: com.huddly.main, PID: 27343
10-18 18:27:33.307: E/AndroidRuntime(27343): android.os.NetworkOnMainThreadException
10-18 18:27:33.307: E/AndroidRuntime(27343): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1148)
10-18 18:27:33.307: E/AndroidRuntime(27343): at java.net.InetAddress.lookupHostByName(InetAddress.java:400)
10-18 18:27:33.307: E/AndroidRuntime(27343): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:251)
10-18 18:27:33.307: E/AndroidRuntime(27343): at java.net.InetAddress.getAllByName(InetAddress.java:229)
10-18 18:27:33.307: E/AndroidRuntime(27343): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
10-18 18:27:33.307: E/AndroidRuntime(27343): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
try {
sb.append("?address=").append(URLEncoder.encode(address, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
};
此解決方案建議我圍繞新的「sb.append(」?address =「)。append(URLEncoder.encode(address,」UTF-8「));」帶有一個用於UnsupportedEncodingException的try/catch塊。我將更新問題中的堆棧跟蹤,以便您可以看到發生了什麼。 – 2014-10-18 22:27:54
我想你已經征服了第一個錯誤,現在遇到了一個無關的新錯誤。我還沒有在Android上進行過深入的編程,但是NetworkOnMainThreadException似乎表明該方法必須在另一個線程上調用。也許你應該在標題中添加一個帶有「NetworkOnMainThreadException」的新問題。 – 2014-10-19 09:30:17