2013-05-27 3 views
2

Google지도 활동이 Google Maps Geocoding API V3 인 주소를 검색합니다.
가끔씩 여러 번 검색을 반복하더라도 데이터 연결로 연결할 때 Google지도의 응답은 OVER_QUERY_LIMIT입니다.
앱을 기기에 설치 한 후 처음으로 검색 할 때도 발생합니다.
내가 Wi-Fi에 연결되어 있으면 완벽하게 작동합니다.
내 코드는 다음과 같습니다.
검색 방법 :Google지도 지오 코딩 API V3는 Wi-Fi로 검색하지만 OVER_QUERY_LIMIT는 데이터 연결로 응답합니다.

public static JSONObject getAddressInfo(String sAddress) { 
    HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" + sAddress + "&region=it&language=it&sensor=false"); 
    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) { 
    } catch (IOException e) { 
    } 

    JSONObject jsonObject = new JSONObject(); 
    try { 
     jsonObject = new JSONObject(stringBuilder.toString()); 
     Log.d("Google Geocoding Response", stringBuilder.toString()); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return jsonObject; 
} 

응답 관리 : 최대, 나는이 OVER_QUERY_LIMIT을받을 경우 구글마다 200 밀리 다시 쿼리 :

JSONObject jsonObject = Utils.getAddressInfo(Utils.strToUrl(inputName.getText().toString().trim())); 
    try { 
     String sStatus = jsonObject.getString("status"); 
     if (sStatus.equals("OK")) { 
      lng = ((JSONArray)jsonObject.get("results")).getJSONObject(0).getJSONObject("geometry").getJSONObject("location").getDouble("lng"); 
      lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0).getJSONObject("geometry").getJSONObject("location").getDouble("lat");      
      bdlData.putDouble("lat", lat); 
      bdlData.putDouble("lng", lng); 
      bdlData.putFloat("dZoom", dZoom); 
      message.setData(bdlData); 
      mapHandler.sendMessage(message); 
     } else if (sStatus.equals("ZERO_RESULTS")) { 
      runMsgOnUIThread("Nessun risultato trovato."); 
     } else if (sStatus.equals("OVER_QUERY_LIMIT")) { 
      runMsgOnUIThread("Impossibile effettuare la ricerca al momento. Riprovare fra qualche secondo."); 
     } else if (sStatus.equals("REQUEST_DENIED")) { 
      runMsgOnUIThread("Richiesta non accettata. Riprovare."); 
     } else if (sStatus.equals("INVALID_REQUEST")) { 
      runMsgOnUIThread("Indirizzo non esistente."); 
     } else if (sStatus.equals("UNKNOWN_ERROR")) { 
      runMsgOnUIThread("Impossibile effettuare la ricerca al momento. Riprovare.");     
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

답변

6

귀하의 문제는 대개 모바일 운영자에게 있습니다. 대다수의 운영자는 NAT 오버로드라는 기술을 사용하여 동일한 외부 IP를 여러 장치에 할당합니다. 운영자가 매우 많은 수의 장치를 단일 IP에 할당하고 그 중 다수가 유사한 서비스를 사용하는 경우, 모든 요청이 동일한 IP에서 발생하는 것처럼 보일 수 있으므로 모든 사용자가 문제를 겪습니다.

10 * 200ms 리퀘스트의 성공 여부는 서버 측의 OVER_QUERY_LIMIT 플래그의 만료와 관련이있는 것 같습니다.이 상태를 수신하면이 (Usage Limits for Google Maps API Web Services) 문서에 암시되어 있음을 나타냅니다. 2 초 후 재발행하여 일일 사용량을 초과했는지 또는 너무 많은 요청을 보냈는지 확인하십시오.

휴대 전화에 고유 한 IP가 있기 때문에 Wi-Fi를 통해 발생하지 않습니다.

+0

지원해 주셔서 감사합니다. 이상한 점은 같은 연결을 통해 다음과 같이 생각할 수 있습니다. a) Google지도 앱이 완벽하게 작동합니다. b) Android Geocoder 클래스가 완벽하게 작동합니다 (다른 문제로 인해 실제로 사용하지 않음). 이제 어떻게해야합니까? – UmbySlipKnot

+1

Google지도 앱은 Google 클라이언트 ID를 가장 많이 사용하므로 앱에 제한이 없습니다. 지오 코더 클래스가 제대로 작동하면 해당 클라이언트 ID도 사용하거나 요청을보다 효율적으로 조절하고 캐싱합니다. – aBrav

+0

나는 이해한다. 그럼이 문제에 대해 내가 무엇을 권하고 싶니? 누군가가 Geocoder 클래스를 사용하지 말라고 말했습니다. http://stackoverflow.com/a/16656050/1769013 – UmbySlipKnot

0

가 나는 종종 (항상) 문제를 해결하는 해결 방법을 발견 10 번.