天気の情報を取得する~Androidアプリの作り方~
スマートフォンのセンサと、Webに公開されている情報を利用するひとつの例として、位置情報を取得してその位置に対応する天気の情報を取得する方法についてまとめてみました。
位置情報の取得は、以下のページを参考にすれば、それほど問題なく出来ました。
Android 位置情報を取得するには / Getting Started | Tech Booster
天気の情報は、OpenWeatherMapというところで提供しているAPIを使わせて頂くことにしました。
OpenWeatherMap current weather and forecast
APIのライセンスについては、以下のページに書いてありますが、クリエイティブ・コモンズ・ライセンスの中の、「cc-by-sa」というものだそうです。
このライセンスについて、以下に解説がありますが、使用する場合に「OpenWeatherMap」から提供されたデータを使っているというのを表示して、リンクを付ければ良いようです。
Creative Commons — 表示 - 継承 2.1 日本 — CC BY-SA 2.1 JP
具体的になんて書くのが良いのか迷いましたが、結局ありがちな感じで、「Powered by OpenWeatherMap」と入れることにしました。
アプリからのリンクのはり方ですが、別のAtcivityへ移る時と同じようにonClickLintnerを使って、以下のようにすれば、出来ました。
OnClickListener link_Listener = new OnClickListener() {
public void onClick(View v) {
Uri uri = Uri.parse("http://openweathermap.org/");
Intent i = new Intent(Intent.ACTION_VIEW,uri);
startActivity(i);
}
};
これを応用して、緯度と経度をgoogleMapに渡して表示させるというのも、こんな感じで出来ました。
OnClickListener map_Listener = new OnClickListener() {
public void onClick(View v) {
TextView data1 = (TextView)findViewById(2000);
TextView data2 = (TextView)findViewById(4000);
Uri uri = Uri.parse("http://maps.google.com/maps?q=" + data1.getText().toString() + "," + data2.getText().toString());
Intent i = new Intent(Intent.ACTION_VIEW,uri);
startActivity(i);
}
};
※緯度と経度が、2000と4000のIDのTextViewに書かれている場合の例です。
OpenWeatherMapから取得できるデータは天気のデータだけでも色々あります。
形式もJASON形式とXML形式があります。
例えば、以下のようなにすれば、データを取得できます。
// 緯度の取得
double latitude = location.getLatitude();
// 経度の取得
double longitude = location.getLongitude();
String requestURL = "http://api.openweathermap.org/data/2.5/weather?lat=" + String.valueOf(latitude) + "&lon=" + String.valueOf(longitude) + "&mode=xml";
URL url;
try {
url = new URL(requestURL);
InputStream is = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuilder sb = new StringBuilder();
String line;
while (null != (line = reader.readLine())) {
sb.append(line.replace(BR, ""));
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
として、sb.toString();を参照することで、データを取得できます。
JavaのクラスでJASON形式のハンドリングを試みましたが、うまくいかなかったので、今回はXML形式を使うことにしました。
XML形式といっても複雑な構造ではないので、タグをパターンでマッチングさせてやれば結構簡単にハンドリングできました。
本当はもっとちゃんとしたやり方があるはずですけど。
あとは表形式に変換してやると以下のような感じになりました。
私が使っているスマートフォンでは位置情報の精度が悪いみたいで結構離れた場所の天気をもらってくることもあるのですが、まぁ、天気なので実用上は問題ないかと思います。
最近はオープンデータが話題になっていますが、こんな感じで、WebAPIからデータを取得できたので、色々な応用ができるかもしれません。
天気によって、体調が左右されるというお話もよく聞きますので、天気を記録する機能をアプリに追加しました。
うつ日記 ~うつを克服するための日記~
https:/