Search code examples
androidweather-api

Android, Can't get weather from google api


The following code work well before:

class RetreiveWeatherTask extends AsyncTask<Bundle, Void, WeatherData> {

        private static final String TAG = "WeatherManager";

        @Override
        protected WeatherData doInBackground(Bundle... params) {
            Utils.log(TAG, "start get weather");
            WeatherData weatherData = new WeatherData();
            Bundle b = new Bundle(params[0]);
            double latitude = b.getDouble(REF_LAT);
            double longtitude = b.getDouble(REF_LONG);

            try
            {
                StringBuilder weatherBuilder = new StringBuilder();
                //weatherBuilder.append("http://www.google.com/ig/api?hl=zh-cn&weather=,,,");
                weatherBuilder.append("http://www.google.com/ig/api?hl=en-us&weather=,,,");
                int la = (int) latitude * 1000000;
                int lo = (int) longtitude * 1000000;
                weatherBuilder.append(la);
                weatherBuilder.append(",");
                weatherBuilder.append(lo);
                String weather = weatherBuilder.toString();
                HttpGet hg = new HttpGet(weather);
                // HttpGet hg = new
                // HttpGet("http://www.google.com/ig/api?hl=zh-cn&weather=,,,39130000,117200000");
                HttpClient hc = new DefaultHttpClient();
                HttpResponse hr = hc.execute(hg);
                String responseString = "";
                if (hr.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
                {
                    Utils.logi("", "Location != HttpStatus.SC_OK");
                    return null;
                }
                responseString = EntityUtils.toString(hr.getEntity());
                InputStream is = new ByteArrayInputStream(responseString.getBytes());

                // URL url = new
                // URL("http://www.google.com/ig/api?hl=zh-cn&weather=,,,39130000,117200000");
                // InputStream is =url.openStream();
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document document = db.parse(is);

                NodeList currList = (NodeList) document.getElementsByTagName("current_conditions");
                NodeList currList2 = currList.item(0).getChildNodes();

                weatherData.weather = new String(currList2.item(0).getAttributes().item(0).getNodeValue());

                weatherData.curTemperature = new String(currList2.item(2).getAttributes().item(0).getNodeValue() + "℃");

                weatherData.wind = new String(currList2.item(5).getAttributes().item(0).getNodeValue());

                Utils.log(TAG, "Get weather = " + weatherData.weather);
                if (isNeedIconFromNet)
                {
                    weatherData.iconUrl = new String(currList2.item(4).getAttributes().item(0).getNodeValue());


                    String url = "http://www.google.com" + weatherData.iconUrl;
                    weatherData.icon = getBitmapByUrl(url);
                }

            }
            catch (Exception e)
            {
                Utils.logi("", "Location get temp Exception e");
                e.printStackTrace();
            }

            return weatherData;
        }

But now It return the String: Unsupported API .

Please help me. Is google api closed? PS. I'm in China.


Solution

  • Yes, it seems like Google has stopped the undocumented weather api service.

    XML Parsing Error: syntax error
    Location: http://www.google.com/ig/api?weather=delhi
    Line Number 1, Column 1:Unsupported API
    ^
    

    You may want to try yahoo weather or http://www.wunderground.com/weather/api. However, google provided around 4 days weather forecast while yahoo just provides around 2 days forecast (there may be some other way to get more days' forecast from yahoo indirectly).