2015-11-04 118 views
0

我是Android的新手。我需要帮助来解决下面的错误。 卡在这里。错误:无法找到符号变量MyOpenWeatherMapApiKey Android

public class ForecastFragment extends Fragment { 

    private ArrayAdapter<String> mForecastAdapter; 

    public ForecastFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Add this line in order for this fragment to handle menu events. 
     setHasOptionsMenu(true); 
    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     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) { 

     // Create some dummy data for the ListView. Here's a sample weekly forecast 
     String[] data = { 
       "Mon 6/23 - Sunny - 31/17", 
       "Tue 6/24 - Foggy - 21/8", 
       "Wed 6/25 - Cloudy - 22/17", 
       "Thurs 6/26 - Rainy - 18/11", 
       "Fri 6/27 - Foggy - 21/10", 
       "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18", 
       "Sun 6/29 - Sunny - 20/7" 
     }; 
     List<String> weekForecast = new ArrayList<String>(Arrays.asList(data)); 

     // Now that we have some dummy forecast data, create an ArrayAdapter. 
     // The ArrayAdapter will take data from a source (like our dummy forecast) and 
     // use it to populate the ListView it's attached to. 
     mForecastAdapter = 
       new ArrayAdapter<String>(
         getActivity(), // The current context (this activity) 
         R.layout.list_item_forecast, // The name of the layout ID. 
         R.id.list_item_forecast_textview, // The ID of the textview to populate. 
         weekForecast); 

     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

     // Get a reference to the ListView, and attach this adapter to it. 
     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(); 

     /* The date/time conversion code is going to be moved outside the asynctask later, 
     * so for convenience we're breaking it out into its own method now. 
     */ 
     private String getReadableDateString(long time){ 
      // Because the API returns a unix timestamp (measured in seconds), 
      // it must be converted to milliseconds in order to be converted to valid date. 
      SimpleDateFormat shortenedDateFormat = new SimpleDateFormat("EEE MMM dd"); 
      return shortenedDateFormat.format(time); 
     } 

     /** 
     * Prepare the weather high/lows for presentation. 
     */ 
     private String formatHighLows(double high, double low) { 
      // For presentation, assume the user doesn't care about tenths of a degree. 
      long roundedHigh = Math.round(high); 
      long roundedLow = Math.round(low); 

      String highLowStr = roundedHigh + "/" + roundedLow; 
      return highLowStr; 
     } 

     /** 
     * Take the String representing the complete forecast in JSON Format and 
     * pull out the data we need to construct the Strings needed for the wireframes. 
     * 
     * Fortunately parsing is easy: constructor takes the JSON string and converts it 
     * into an Object hierarchy for us. 
     */ 
     private String[] getWeatherDataFromJson(String forecastJsonStr, int numDays) 
       throws JSONException { 

      // These are the names of the JSON objects that need to be extracted. 
      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_DESCRIPTION = "main"; 

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

      // OWM returns daily forecasts based upon the local time of the city that is being 
      // asked for, which means that we need to know the GMT offset to translate this data 
      // properly. 

      // Since this data is also sent in-order and the first day is always the 
      // current day, we're going to take advantage of that to get a nice 
      // normalized UTC date for all of our weather. 

      Time dayTime = new Time(); 
      dayTime.setToNow(); 

      // we start at the day returned by local time. Otherwise this is a mess. 
      int julianStartDay = Time.getJulianDay(System.currentTimeMillis(), dayTime.gmtoff); 

      // now we work exclusively in UTC 
      dayTime = new Time(); 

      String[] resultStrs = new String[numDays]; 
      for(int i = 0; i < weatherArray.length(); i++) { 
       // For now, using the format "Day, description, hi/low" 
       String day; 
       String description; 
       String highAndLow; 

       // Get the JSON object representing the day 
       JSONObject dayForecast = weatherArray.getJSONObject(i); 

       // The date/time is returned as a long. We need to convert that 
       // into something human-readable, since most people won't read "1400356800" as 
       // "this saturday". 
       long dateTime; 
       // Cheating to convert this to UTC time, which is what we want anyhow 
       dateTime = dayTime.setJulianDay(julianStartDay+i); 
       day = getReadableDateString(dateTime); 

       // description is in a child array called "weather", which is 1 element long. 
       JSONObject weatherObject = dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0); 
       description = weatherObject.getString(OWM_DESCRIPTION); 

       // Temperatures are in a child object called "temp". Try not to name variables 
       // "temp" when working with temperature. It confuses everybody. 
       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 there's no zip code, there's nothing to look up. Verify size of params. 
      if (params.length == 0) { 
       return null; 
      } 

      // These two need to be declared outside the try/catch 
      // so that they can be closed in the finally block. 
      HttpURLConnection urlConnection = null; 
      BufferedReader reader = null; 

      // Will contain the raw JSON response as a string. 
      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"; 
       final String APPID_PARAM = "02867cfd75153da1eda43a17f213ffc5"; 


       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)) 
         .appendQueryParameter(APPID_PARAM, BuildConfig.OPEN_WEATHER_MAP_API_KEY) 

         .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. 
        return 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. 
        return null; 
       } 
       forecastJsonStr = buffer.toString(); 

       Log.v(LOG_TAG, "Forecast string: " + forecastJsonStr); 
      } 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. 
       return 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(); 
      } 

      // This will only happen if there was an error getting or parsing the forecast. 
      return null; 
     } 


      } 
     } 
    } 
} 

[{ 
public final class BuildConfig { 
    public static final boolean DEBUG = Boolean.parseBoolean("true"); 
    public static final String APPLICATION_ID = "com.example.patels.sunshine"; 
    public static final String BUILD_TYPE = "debug"; 
    public static final String FLAVOR = ""; 
    public static final int VERSION_CODE = 1; 
    public static final String VERSION_NAME = "1.0"; 
    // Fields from build type: debug 
    public static final String OPEN_WEATHER_MAP_API_KEY = MyOpenWeatherMapApiKey; 
} 

enter image description here

我写了这个代码....我被困here..Unable解决错误。 帮我出来....谢谢

回答

4

在应用程序文件夹下你可以找到build.gradle文件,在这使得下面这个改变。

由于您使用,你必须使用这个语法的字符串:

it.buildConfigField "String" , "OPEN_WEATHER_MAP_API_KEY" , "\"MyOpenWeatherMapApiKey\"" 

最后一个参数必须是一个字符串。

+0

谢谢你,傻!当Udacity球场开始大麦时,我们应该怎么知道这一点 – fullMoon

0

你应该在这里创建一个帐户http://openweathermap.org/,当你注册你的电子邮件时,你会得到一个APIKey为你的帐户。使用这个API密钥和下面的行替换MyOpenWeatherMapApiKey:

public static final String OPEN_WEATHER_MAP_API_KEY = MyOpenWeatherMapApiKey; 

另一种方法是为已经提议写APIKey在grandle文件。

相关问题