2014-10-18 18 views
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(); 
    }; 

回答

3
sb.append("?address=").append(URLEncoder.encode(address, "UTF-8")); 

的空間應該是+%20。一個應該使用正確的編碼,但對於一個空間來說,它並不重要。

+0

此解決方案建議我圍繞新的「sb.append(」?address =「)。append(URLEncoder.encode(address,」UTF-8「));」帶有一個用於UnsupportedEncodingException的try/catch塊。我將更新問題中的堆棧跟蹤,以便您可以看到發生了什麼。 – 2014-10-18 22:27:54

+0

我想你已經征服了第一個錯誤,現在遇到了一個無關的新錯誤。我還沒有在Android上進行過深入的編程,但是NetworkOnMainThreadException似乎表明該方法必須在另一個線程上調用。也許你應該在標題中添加一個帶有「NetworkOnMainThreadException」的新問題。 – 2014-10-19 09:30:17