利用Accuweather實作天氣APP
雖說這只是公司要求新人自己練習用的,但是自己從來沒寫過app(除非要說hello world也算的話),因此想自己嘗試看看做一個簡單的天氣app。
大致上的概念就是,用這個網頁過去會直接收到一個json檔案,
然後把這個json檔案拆成很多部分放進app裡面。
按下手機上面的按鈕之後就會換頁,新的頁面會顯示天氣的資訊。
activity_main.xml (主頁面)
weather.xml (用來顯示天氣結果)
MainActivity.java
分別做了四個地點,台北,橫濱,越南跟札幌
題外話,
大概眼尖的網友會注意到我用了兩次fetchPost,我總共抓了兩個json檔案
主要是因為我第一個抓的是當日的天氣,第二個抓的是該周的天氣預報
所以會用到兩個API,才需要分開兩次抓。
好像這個網站沒有提供一次抓就可以直接抓取所有資料的方法呢...
有需要source code的話這邊有:
https://github.com/LeeHeng1121/weather_api
先註冊帳號之後取得專案apikey(沒有這個就不能從這個網站取資料啦)
之後會在程式裡面用到。
取當下天氣資料的字串大概是長這樣子的(抓的是日文資料,要改的話在網址後面的language=ja可以修改):
location_code和是地區碼(在這裡可以抓該網站專用的地區碼)http://dataservice.accuweather.com/currentconditions/v1/"+location_code+"?apikey=" + apikey +"&language=ja";
大致上的概念就是,用這個網頁過去會直接收到一個json檔案,
然後把這個json檔案拆成很多部分放進app裡面。
按下手機上面的按鈕之後就會換頁,新的頁面會顯示天氣的資訊。
activity_main.xml (主頁面)
<linearlayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <linearlayout android:layout_height="93dp" android:layout_width="match_parent" android:orientation="horizontal"> <button android:id="@+id/button_sapporo" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="buttonOnClick" android:text="@string/sapporoText"> </button><button android:id="@+id/button_yokohama" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="buttonOnClick" android:text="@string/yokohamaText"> </button><button android:id="@+id/button_taipei" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="buttonOnClick" android:text="@string/taipeiText"> </button><button android:id="@+id/button_vietnam" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="buttonOnClick" android:text="@string/vietnamText"> </button></linearlayout> <linearlayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="horizontal"> <button android:id="@+id/button_api" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="buttonOnClick" android:text="@string/button_api"> </button></linearlayout> </linearlayout>
weather.xml (用來顯示天氣結果)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="93dp" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sapporoText" android:id="@+id/button_sapporo" android:onClick="buttonOnClick"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yokohamaText" android:id="@+id/button_yokohama" android:onClick="buttonOnClick"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/taipeiText" android:id="@+id/button_taipei" android:onClick="buttonOnClick"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/vietnamText" android:id="@+id/button_vietnam" android:onClick="buttonOnClick"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_api" android:id="@+id/button_api" android:onClick="buttonOnClick"/> </LinearLayout> </LinearLayout>
MainActivity.java
import android.app.Activity; import android.icu.text.SimpleDateFormat; import android.os.Build; import android.os.Bundle; import android.support.annotation.RequiresApi; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.text.ParseException; import java.util.Date; public class MainActivity extends Activity{ String place = ""; String apikey1 = "專案APIKEY1"; String apikey2 = "專案APIKEY2"; String apikey=apikey1; String location_code_taipei = "4-315078_1_AL"; String location_code_vietnam = "1-353981_1_AL"; String location_code_yokohama = "2383413"; String location_code_sapporo = "1-223985_1_AL"; String location_code=""; String ENDPOINT= ""; int flag=0; private RequestQueue requestQueue; @Override protected void onCreate(Bundle bundle){ super.onCreate(bundle); setContentView(R.layout.activity_main); requestQueue = Volley.newRequestQueue(this); } private void fetchPosts(int i) { if (i==1){ ENDPOINT= "http://dataservice.accuweather.com/currentconditions/v1/"+location_code+"?apikey=" + apikey +"&language=ja"; }else if (i==2){ ENDPOINT = "http://dataservice.accuweather.com/forecasts/v1/daily/1day/" + location_code + "?apikey=" + apikey + "&language=ja&metric=true"; } StringRequest request = new StringRequest(Request.Method.GET, ENDPOINT, onPostsLoaded, onPostsError); requestQueue.add(request); } private final Response.ListeneronPostsLoaded = new Response.Listener (){ @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onResponse(String response){ Log.i("PostActivity",response); try { JSONArray jArr = new JSONArray(response); JSONObject jo = jArr.getJSONObject(0); System.out.println("LocalObservationDateTime:" + jo.getString("LocalObservationDateTime")); TextView tmp = findViewById(R.id.time); SimpleDateFormat timetmp = new SimpleDateFormat(jo.getString("LocalObservationDateTime")); String inputPattern = "yyyy-MM-dd'T'hh:mm:ssX"; SimpleDateFormat inputFormat = new SimpleDateFormat(inputPattern); Date date = null; try { date = inputFormat.parse(jo.getString("LocalObservationDateTime")); tmp.setText(date.toString()); } catch (ParseException e) { e.printStackTrace(); } System.out.println("WeatherText:" + jo.getString("WeatherText")); tmp = findViewById(R.id.weather); tmp.setText(jo.getString("WeatherText")); JSONObject Temperature = jo.getJSONObject("Temperature"); JSONObject Metric = Temperature.getJSONObject("Metric"); System.out.println("Temperature:" + Metric.getString("Value")); tmp = findViewById(R.id.temperature); tmp.setText(Metric.getString("Value")); tmp = findViewById(R.id.place); tmp.setText(place); } catch (JSONException e) { e.printStackTrace(); } try { JSONObject jo = new JSONObject(response); JSONObject Headline = jo.getJSONObject("Headline"); System.out.println("Text:" + Headline.getString("Text")); JSONArray DailyForecasts = jo.getJSONArray("DailyForecasts"); JSONObject jo2 = DailyForecasts.getJSONObject(0); JSONObject Temperature = jo2.getJSONObject("Temperature"); JSONObject Minimum = Temperature.getJSONObject("Minimum"); JSONObject Maximum = Temperature.getJSONObject("Maximum"); System.out.println("Minimum:" + Minimum.getString("Value")); System.out.println("Maximum:" + Maximum.getString("Value")); TextView tmp; tmp = findViewById(R.id.forcastText); tmp.setText(Headline.getString("Text")); tmp = findViewById(R.id.min); tmp.setText(Minimum.getString("Value")); tmp = findViewById(R.id.max); tmp.setText(Maximum.getString("Value")); } catch (JSONException e) { e.printStackTrace(); } } }; private final Response.ErrorListener onPostsError = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("PostActivity", error.toString()); } }; public void buttonOnClick(View view) { switch (view.getId()) { case R.id.button_sapporo: place="Sapporo"; location_code=location_code_sapporo; fetchPosts(1); fetchPosts(2); setContentView(R.layout.weather); break; case R.id.button_yokohama: place="Yokohama"; location_code=location_code_yokohama; fetchPosts(1); fetchPosts(2); setContentView(R.layout.weather); break; case R.id.button_taipei: place="Taipei"; location_code=location_code_taipei; fetchPosts(1); fetchPosts(2); setContentView(R.layout.weather); break; case R.id.button_vietnam: place="Vietnam"; location_code=location_code_vietnam; fetchPosts(1); fetchPosts(2); setContentView(R.layout.weather); break; case R.id.button_GoHome: setContentView(R.layout.activity_main); break; case R.id.button_api: if(apikey.equals(apikey1)){ apikey=apikey2; Toast.makeText(this, "apikey2 loaded. \n "+ apikey, Toast.LENGTH_SHORT).show(); }else{ apikey=apikey1; Toast.makeText(this, "apikey1 loaded. \n "+ apikey, Toast.LENGTH_SHORT).show(); } break; } } }
分別做了四個地點,台北,橫濱,越南跟札幌
題外話,
大概眼尖的網友會注意到我用了兩次fetchPost,我總共抓了兩個json檔案
主要是因為我第一個抓的是當日的天氣,第二個抓的是該周的天氣預報
所以會用到兩個API,才需要分開兩次抓。
好像這個網站沒有提供一次抓就可以直接抓取所有資料的方法呢...
有需要source code的話這邊有:
https://github.com/LeeHeng1121/weather_api
留言
張貼留言