谷歌地图API调用在Android上失败,"automated queries"错误



我正在使用Google API使用以下方法从coordnates检索地址:

public static String[] getFromLocation(double lat, double lng, int retries) {
    String address = String.format(Locale.getDefault(), 
            "https://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=false&language=" 
                    + Locale.getDefault(), lat, lng);
    String[] res = new String[3];
    String addressLine = "";
    String locality = "";
    String country = "";
    String json = null;
    HttpURLConnection conn = null;
    StringBuilder jsonResults = new StringBuilder();
    try {
        URL url = new URL(address);
        conn = (HttpURLConnection) url.openConnection();
        InputStreamReader in = new InputStreamReader(conn.getInputStream());
        int read;
        char[] buff = new char[1024];
        while ((read = in.read(buff)) != -1) {
            jsonResults.append(buff, 0, read);
        }
        json = jsonResults.toString();
        JSONObject jsonObject = new JSONObject(json);

        if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) {
            JSONArray results = jsonObject.getJSONArray("results");
            if (results.length() > 0) {
                JSONObject result = results.getJSONObject(0);
                //Address addr = new Address(Locale.getDefault());
                JSONArray components = result.getJSONArray("address_components");
                String streetNumber = "";
                String route = "";
                for (int a = 0; a < components.length(); a++) {
                    JSONObject component = components.getJSONObject(a);
                    JSONArray types = component.getJSONArray("types");
                    for (int j = 0; j < types.length(); j++) {
                        String type = types.getString(j);
                        if (type.equals("locality")) {
                            locality = component.getString("long_name");
                        } else if (type.equals("street_number")) {
                            streetNumber = component.getString("long_name");
                        } else if (type.equals("route")) {
                            route = component.getString("long_name");
                        } else if (type.equals("country")) {
                            country = component.getString("long_name");
                        }
                    }
                }
                addressLine = route + " " + streetNumber;
            }
        }
    } catch (Exception e) {
        Log.e(LOG_TAG, "Exception:", e);
        LogsToServer.send(my_id, e);
        if (json != null) LogsToServer.send(my_id, json);
        System.out.println("retries: " + retries);
        if (retries > 0){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            return getFromLocation(lat, lng, retries-1);
        }
    }
    res[0] = addressLine;
    res[1] = locality;
    res[2] = country; 
    return res;
}

问题是我经常得到例外:

03-12 23:54:01.387: E/GetAddressDetails(25248): java.io.FileNotFoundException: https://maps.googleapis.com/maps/api/geocode/json?latlng=48,2&sensor=false&language=en_GB
03-12 23:54:01.387: E/GetAddressDetails(25248):     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:197)
03-12 23:54:01.387: E/GetAddressDetails(25248):     at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
03-12 23:54:01.387: E/GetAddressDetails(25248):     at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25)

如果我通过 4 次重试启动该方法,它们可能会全部失败,或者有时在 2 或 3 次后我得到地址。你知道为什么它经常失败吗?当我在浏览器中访问同一站点时,我总是得到没有错误的页面!

编辑:我检查了谷歌返回的错误消息,它是这样的:

We're sorry... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.

这是开玩笑吗?自动查询?由自动进程调用 API 不是全部目的吗?此外,这种情况发生在许多手机上,并且从昨天开始。谷歌如何知道所有请求都来自同一个应用程序?

如果你想从cooridnates获取地址,你可以使用Geocoder api。

我在应用程序中使用以下代码来get the city name

private double mLongitude; // current longitude
private double mLatitude; // current latitude
private String mCityName; // output cityName
private void getCityName() {
        Geocoder gcd = new Geocoder(this, Locale.getDefault());
        List<Address> addresses;
        try {
            addresses = gcd.getFromLocation(mLatitude, mLongitude, 1);
            if (addresses.size() != 0) {
                mCityName = addresses.get(0).getAddressLine(1);
                mCityName = mCityName.replaceAll("[\d.]", "");
                Log.d(TAG + "!!!!!!!!!!!", mCityName);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

如果你想得到whole address,因为我改变了一点,就这样做:

private double mLongitude; // current longitude
private double mLatitude; // current latitude
private String mAddress; // output address
private void getAddress() {
        Geocoder gcd = new Geocoder(this, Locale.getDefault());
        List<Address> addresses;
        try {
            addresses = gcd.getFromLocation(mLatitude, mLongitude, 1);
            if (addresses.size() != 0) {
                mAddress = addresses.get(0).getAddressLine(0) + " " +
                        addresses.get(0).getAddressLine(1) + " " +
                        addresses.get(0).getAddressLine(2);
                //mAddress = mAddress.replaceAll("[\d.]", "");
                Log.d(TAG + "!!!!!!!!!!!", mAddress);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

相关内容

  • 没有找到相关文章

最新更新