2015-10-14 33 views
0

我是Android開發的初學者,我一直在關注SUNSHINE應用程序。一切似乎一直很好,直到今天我運行該應用程序,發現一個錯誤:java.io.FileNotFoundException:http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7UDACITY陽光Android應用程序錯誤 - java.io.FileNotFoundException

我做了我的研究,它出現Openweathermap api現在需要一個API密鑰。 作爲一個初學者,我不知道如何實現這個到我目前的應用程序,所以我可以繼續我的課程。我只是STUCK因爲this.and我希望通過/幫助任何工作解決此問題:(THANK YOU)

這裏是我的ForecastFragment.java

package com.example.android.sunshine.app; 
 

 
import android.net.Uri; 
 
import android.os.AsyncTask; 
 
import android.os.Bundle; 
 
import android.support.v4.app.Fragment; 
 
import android.util.Log; 
 
import android.view.LayoutInflater; 
 
import android.view.Menu; 
 
import android.view.MenuInflater; 
 
import android.view.MenuItem; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.ArrayAdapter; 
 
import android.widget.ListView; 
 

 
import org.json.JSONArray; 
 
import org.json.JSONException; 
 
import org.json.JSONObject; 
 

 
import java.io.BufferedReader; 
 
import java.io.IOException; 
 
import java.io.InputStream; 
 
import java.io.InputStreamReader; 
 
import java.net.HttpURLConnection; 
 
import java.net.URL; 
 
import java.text.SimpleDateFormat; 
 
import java.util.ArrayList; 
 
import java.util.Arrays; 
 
import java.util.Date; 
 
import java.util.List; 
 

 

 
/** 
 
* A placeholder fragment containing a simple view. 
 
*/ 
 
public class ForecastFragment extends Fragment { 
 

 
    private ArrayAdapter<String> mForecastAdapter; 
 

 
    public ForecastFragment() { 
 
    } 
 

 
    @Override 
 
    public void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setHasOptionsMenu(true); 
 
    } 
 

 
    @Override 
 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
 
     inflater.inflate(R.menu.forecastfragment, menu); 
 
    } 
 

 
    @Override 
 
    public boolean onOptionsItemSelected(MenuItem item){ 
 
     int id = item.getItemId(); 
 
     if (id == R.id.action_refresh){ 
 
      FetchWeatherTask weatherTask = new FetchWeatherTask(); 
 
      weatherTask.execute("94043"); 
 

 
      return true; 
 
     } 
 
     return super.onOptionsItemSelected(item); 
 
    } 
 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,   
 
          Bundle savedInstanceState) { 
 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
 

 
     String[] data = { 
 
       "Today - Sunny - 88/63", 
 
       "Tommorow-Foggy-70/40", 
 
       "weds - Cloudy - 72/63", 
 
       "Thurs - Asteroids - 75/65", 
 
       "Fri - Heavy Rains - 65/56", 
 
       "Sat - HELP TRAPPED IN WEATHERSATION - 60/51", 
 
       "Sun - Sunny - 80/68" 
 

 
     }; 
 

 
     List<String> weekForecast = new ArrayList<String>(Arrays.asList(data)); 
 

 
     mForecastAdapter =       
 
       new ArrayAdapter<String>(
 
         getActivity(),                  R.layout.list_item_forcast,   
 
         R.id.list_item_forecast_textview,  
 
         weekForecast); 
 

 
     ListView listView = (ListView) rootView.findViewById(
 
       R.id.listView_forecast); 
 
     listView.setAdapter(mForecastAdapter); 
 

 
     return rootView; 
 
    } 
 

 
public class FetchWeatherTask extends AsyncTask<String, Void, String[]> { 
 

 
      private final String LOG_TAG = FetchWeatherTask.class.getSimpleName(); 
 
      private String getReadableDateString(long time){ 
 
       Date date = new Date(time*1000); 
 
       SimpleDateFormat format = new SimpleDateFormat("E,MMM d"); 
 
       return format.format(date).toString(); 
 
      } 
 
      private String formatHighLows(double high,double low){ 
 
      long roundedHigh = Math.round(high); 
 
      long roundedLow = Math.round(low); 
 
      return null; 
 
     } 
 

 

 

 
    private String[] getWeatherDataFromJson(String forecastJsonStr, int numDays) 
 
      throws JSONException{ 
 
     final String OWM_LIST = "list"; 
 
     final String OWM_WEATHER = "weather"; 
 
     final String OWM_TEMPERATURE = "temp"; 
 
     final String OWM_MAX = "max"; 
 
     final String OWM_MIN = "min"; 
 
     final String OWM_DATETIME = "dt"; 
 
     final String OWM_DESCRIPTION = "main"; 
 

 
     JSONObject forecastJson = new JSONObject(forecastJsonStr); 
 
     JSONArray weatherArray = forecastJson.getJSONArray(OWM_LIST); 
 

 
     String[] resultStrs = new String[numDays]; 
 
     for (int i=0; i < weatherArray.length(); i++){ 
 

 
      String day; 
 
      String description; 
 
      String highAndLow; 
 

 
      JSONObject dayForecast = weatherArray.getJSONObject(i); 
 

 
      long dateTime = dayForecast.getLong(OWM_DATETIME); 
 
      day = getReadableDateString(dateTime); 
 

 
      JSONObject weatherObject = dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0); 
 
      description = weatherObject.getString(OWM_DESCRIPTION); 
 

 
      JSONObject temperatureObject = dayForecast.getJSONObject(OWM_TEMPERATURE); 
 
      double high = temperatureObject.getDouble(OWM_MAX); 
 
      double low = temperatureObject.getDouble(OWM_MIN); 
 

 
      highAndLow = formatHighLows(high, low); 
 
      resultStrs[i] = day +"-"+description +"-"+ highAndLow; 
 
     } 
 
     for (String s : resultStrs){ 
 
      Log.v(LOG_TAG,"Forecast entry"+s); 
 
     } 
 
     return resultStrs; 
 
    } 
 

 

 
      @Override 
 
      protected String[] doInBackground(String... params){ 
 
       if (params.length == 0){ 
 
        return null; 
 
       } 
 
         HttpURLConnection urlConnection = null; 
 
       BufferedReader reader = null; 
 

 
     
 
       String forecastJsonStr = null; 
 

 
       String format = "json"; 
 
       String units = "metric"; 
 
       int numDays = 7; 
 

 
       try { 
 
        // Construct the URL for the OpenWeatherMap query 
 
        // Possible parameters are avaiable at OWM's forecast API page, at 
 
        // http://openweathermap.org/API#forecast 
 
        final String FORECAST_BASE_URL = 
 
        "http://api.openweathermap.org/data/2.5/forecast/daily?"; 
 
        final String QUERY_PARAM = "q"; 
 
        final String FORMAT_PARAM = "mode"; 
 
        final String UNITS_PARAM = "units"; 
 
        final String DAYS_PARAM = "cnt"; 
 

 
        Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon() 
 
          .appendQueryParameter(QUERY_PARAM, params[0]) 
 
          .appendQueryParameter(FORMAT_PARAM,format) 
 
          .appendQueryParameter(UNITS_PARAM, units) 
 
          .appendQueryParameter(DAYS_PARAM, Integer.toString(numDays)) 
 
          .build(); 
 

 
        URL url = new URL(builtUri.toString()); 
 
        Log.v(LOG_TAG,"Built URI" + builtUri.toString()); 
 

 
        // Create the request to OpenWeatherMap, and open the connection 
 
        urlConnection = (HttpURLConnection) url.openConnection(); 
 
        urlConnection.setRequestMethod("GET"); 
 
        urlConnection.connect(); 
 

 
        // Read the input stream into a String 
 
        InputStream inputStream = urlConnection.getInputStream(); 
 
        StringBuffer buffer = new StringBuffer(); 
 
        if (inputStream == null) { 
 
         // Nothing to do. 
 
         forecastJsonStr = null; 
 
        } 
 
        reader = new BufferedReader(new InputStreamReader(inputStream)); 
 

 
        String line; 
 
        while ((line = reader.readLine()) != null) { 
 
         // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
 
         // But it does make debugging a *lot* easier if you print out the completed 
 
         // buffer for debugging. 
 
         buffer.append(line + "\n"); 
 
        } 
 

 
        if (buffer.length() == 0) { 
 
         // Stream was empty. No point in parsing. 
 
         forecastJsonStr = null; 
 
        } 
 
        forecastJsonStr = buffer.toString(); 
 
       } catch (IOException e) { 
 
        Log.e(LOG_TAG, "Error ", e); 
 
        // If the code didn't successfully get the weather data, there's no point in attemping 
 
        // to parse it. 
 
        forecastJsonStr = null; 
 
       } finally{ 
 
        if (urlConnection != null) { 
 
         urlConnection.disconnect(); 
 
        } 
 
        if (reader != null) { 
 
         try { 
 
          reader.close(); 
 
         } catch (final IOException e) { 
 
          Log.e(LOG_TAG, "Error closing stream", e); 
 
         } 
 
        } 
 
       } 
 

 
       try { 
 
        return getWeatherDataFromJson(forecastJsonStr, numDays); 
 
       } catch (JSONException e){ 
 
        Log.e(LOG_TAG, e.getMessage(),e); 
 
        e.printStackTrace(); 
 
       } 
 

 
       return null; 
 
      } 
 

 
    @Override 
 
    protected void onPostExecute(String[] result) { 
 
     if (result !=null){ 
 
      mForecastAdapter.clear(); 
 
      for (String dayForecastStr : result){ 
 
       mForecastAdapter.add(dayForecastStr); 
 
      } 
 
      
 
     } 
 

 
    } 
 
} 
 

 

 
}

回答

0

首先sign up for an API key here

然後將API密鑰添加到查詢結束:

http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7&appid=[your_api_key] 
相關問題