通过google接口在Android中实现天气预报效果
Android可以通过google实现获取指定经纬度位置或者某一个城市的天气信息。如果是根据经纬度查询天气信息,需要对精度为进行转换,例如lat值为31.174165,需要过滤掉小数
点,变为31174165传到接口中,维度也一样处理,处理后传
给 http://www.google.com/ig/api?weather=,,,31174165,121433841 既可以获取数据。这里要注意一个问题,如果大家获取的经纬度序列很长,直接去掉小数点,有时候也无法获取天气信息,例如40.478224838152528,124.97828006744385,去掉小数点后,传到参数位置,无法获取值,需要大家将经纬度按下面方式转换一下,只取小数点后6位就可以了。int latI = (int) (lat * 1E6);
int lonI = (int) (lon * 1E6);
下面的例子演示了根据输入城市,获取该城市的天气预报,Weather.java的61行,是根据经纬度获取天气信息。 工程结构:
Weather.java类
package com.AndroidWeather;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource;
import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle;
import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView;
public class Weather extends Activity { public EditText ETplace; public TextView TvPlace; public Button query; public TextView placeName; public ImageView imView;
/** Called when the activity is first created. */ @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
ETplace = (EditText) findViewById(R.id.place); query = (Button) findViewById(R.id.query);
imView = (ImageView) findViewById(R.id.myImageView);
placeName = (TextView) findViewById(R.id.tvPlace);
query.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { try {
TvPlace = (TextView)
findViewById(R.id.tvPlace); //
String place =
ETplace.getText().toString(); String place =
CntoSpell.getFullSpell(ETplace.getText().toString());
//
placeName.setText(place); String weather = \; String url =
\ //
+ place;
String url =
\;
DefaultHttpClient client = new
DefaultHttpClient();
// String strResult = //
HttpUriRequest req = new HttpGet(url); HttpResponse resp = client.execute(req);
EntityUtils.toString(resp.getEntity());
DocumentBuilder b =
HttpEntity ent = resp.getEntity(); InputStream stream = ent.getContent();
// Log.i(\ // 一华氏度等于9/5摄氏度数值+32
DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document d = b.parse(new
InputSource(stream));
NodeList n =
d.getElementsByTagName(\);
// 获得图片url 当天的。
String imgUrl = \; imgUrl +=
n.item(0).getChildNodes().item(3).getAttributes()
// 今后4天预报
.item(0).getNodeValue();
imView.setImageBitmap(Utils.returnBitMap(imgUrl));
{
for (int i = 0; i < n.getLength(); i++)
weather +=
Utils.week(n.item(i).getChildNodes().item(0) }
}
});
}
} catch (Exception e) { }
e.printStackTrace();
.getAttributes().item(0).getNodeValue());
weather += \; weather += (Integer
.parseInt(n.item(i).getChildNodes().item(1)
.getAttributes().item(0).getNodeValue()) - 32) * 5 / 9;
weather += \; weather += (Integer
.parseInt(n.item(i).getChildNodes().item(2)
.getAttributes().item(0).getNodeValue()) - 32) * 5 / 9;
weather += \; weather += Utils
.weather(n.item(i).getChildNodes().item(4)
.getAttributes().item(0).getNodeValue());
}
Log.i(\, weather); TvPlace.setText(weather);
weather += \;
Utils类:
package com.AndroidWeather;
import java.io.IOException; import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class Utils {
public static String week(String enWeek) {
if (enWeek.equals(\) || enWeek.equals(\))
return \星期一\;
else if (enWeek.equals(\) || enWeek.equals(\))
return \星期二\;
else if (enWeek.equals(\) ||
enWeek.equals(\))
return \星期三\;
else if (enWeek.equals(\) ||
enWeek.equals(\))
return \星期四\;
else if (enWeek.equals(\) || enWeek.equals(\))
return \星期五\;
else if (enWeek.equals(\) ||
enWeek.equals(\))
public static String weather(String enWeather) {
if (enWeather.equals(\))
return \晴\;
|| enWeather.equals(\))
}
return \星期六\;
else if (enWeek.equals(\) || enWeek.equals(\))
return \星期日\;
return \;
else if (enWeather.equals(\)
return \多云\;
}
else if (enWeather.equals(\))
return \晴转雨\;
else if (enWeather.equals(\))
return \暴雨\;
else if (enWeather.equals(\))
return \雷阵雨\;
else if (enWeather.equals(\))
return \大雾\;
else if (enWeather.equals(\))
return \有雾\;
else if (enWeather.equals(\))
return \雨\;
else if (enWeather.equals(\))
return \大雨\;
else if (enWeather.equals(\))
return \小雨\;
else if (enWeather.equals(\))
return \大雨\;
else if (enWeather.equals(\))
return \有雪\;
// / 还需要补充。。。。 return \;
public static Bitmap returnBitMap(String imgUrl) {
URL myImgUrl = null; Bitmap bitmap = null; try {
myImgUrl = new URL(imgUrl);
} catch (MalformedURLException e) { } try {
HttpURLConnection conn = (HttpURLConnection) e.printStackTrace();
myImgUrl
.openConnection();
conn.setDoInput(true); conn.connect();
}
}
InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close();
} catch (IOException e) { }
return bitmap;
e.printStackTrace();
CntoSpell类:
package com.AndroidWeather;
import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set;
public class CntoSpell {
private static LinkedHashMap spellMap = null;
static {
if (spellMap == null) {
spellMap = new LinkedHashMap(400); }
initialize();
// System.out.println(\ }
private CntoSpell() { }
private static void spellPut(String spell, int ascii) { spellMap.put(spell, new Integer(ascii)); }
private static void initialize() { spellPut(\, -20319);
spellPut(\, -20317); spellPut(\, -20304); spellPut(\, -20295); spellPut(\, -20292); spellPut(\, -20283); spellPut(\, -20265); spellPut(\, -20257); spellPut(\, -20242); spellPut(\, -20230); spellPut(\, -20051); spellPut(\, -20036); spellPut(\, -20032); spellPut(\, -20026); spellPut(\, -20002); spellPut(\, -19990); spellPut(\, -19986); spellPut(\, -19982); spellPut(\, -19976); spellPut(\, -19805); spellPut(\, -19784); spellPut(\, -19775); spellPut(\, -19774); spellPut(\, -19763); spellPut(\, -19756); spellPut(\, -19751); spellPut(\, -19746); spellPut(\, -19741); spellPut(\, -19739); spellPut(\, -19728); spellPut(\, -19725); spellPut(\, -19715); spellPut(\, -19540); spellPut(\, -19531); spellPut(\, -19525); spellPut(\, -19515); spellPut(\, -19500); spellPut(\, -19484); spellPut(\, -19479);
spellPut(\, -19467); spellPut(\, -19289); spellPut(\, -19288); spellPut(\, -19281); spellPut(\, -19275); spellPut(\, -19270); spellPut(\, -19263); spellPut(\, -19261); spellPut(\, -19249); spellPut(\, -19243); spellPut(\, -19242); spellPut(\, -19238); spellPut(\, -19235); spellPut(\, -19227); spellPut(\, -19224); spellPut(\, -19218); spellPut(\, -19212); spellPut(\, -19038); spellPut(\, -19023); spellPut(\, -19018); spellPut(\, -19006); spellPut(\, -19003); spellPut(\, -18996); spellPut(\, -18977); spellPut(\, -18961); spellPut(\, -18952); spellPut(\, -18783); spellPut(\, -18774); spellPut(\, -18773); spellPut(\, -18763); spellPut(\, -18756); spellPut(\, -18741); spellPut(\, -18735); spellPut(\, -18731); spellPut(\, -18722); spellPut(\, -18710); spellPut(\, -18697); spellPut(\, -18696);
spellPut(\, -18526); spellPut(\, -18518); spellPut(\, -18501); spellPut(\, -18490); spellPut(\, -18478); spellPut(\, -18463); spellPut(\, -18448); spellPut(\, -18447); spellPut(\, -18446); spellPut(\, -18239); spellPut(\, -18237); spellPut(\, -18231); spellPut(\, -18220); spellPut(\, -18211); spellPut(\, -18201); spellPut(\, -18184); spellPut(\, -18183); spellPut(\, -18181); spellPut(\, -18012); spellPut(\, -17997); spellPut(\, -17988); spellPut(\, -17970); spellPut(\, -17964); spellPut(\, -17961); spellPut(\, -17950); spellPut(\, -17947); spellPut(\, -17931); spellPut(\, -17928); spellPut(\, -17922); spellPut(\, -17759); spellPut(\, -17752); spellPut(\, -17733); spellPut(\, -17730); spellPut(\, -17721); spellPut(\, -17703); spellPut(\, -17701); spellPut(\, -17697); spellPut(\, -17692);
spellPut(\, -17683); spellPut(\, -17676); spellPut(\, -17496); spellPut(\, -17487); spellPut(\, -17482); spellPut(\, -17468); spellPut(\, -17454); spellPut(\, -17433); spellPut(\, -17427); spellPut(\, -17417); spellPut(\, -17202); spellPut(\, -17185); spellPut(\, -16983); spellPut(\, -16970); spellPut(\, -16942); spellPut(\, -16915); spellPut(\, -16733); spellPut(\, -16708); spellPut(\, -16706); spellPut(\, -16689); spellPut(\, -16664); spellPut(\,-16657); spellPut(\, -16647); spellPut(\, -16474); spellPut(\, -16470); spellPut(\, -16465); spellPut(\, -16459); spellPut(\, -16452); spellPut(\, -16448); spellPut(\, -16433); spellPut(\, -16429); spellPut(\, -16427); spellPut(\, -16423); spellPut(\, -16419); spellPut(\, -16412); spellPut(\, -16407); spellPut(\, -16403); spellPut(\, -16401);
spellPut(\, -16393); spellPut(\, -16220); spellPut(\, -16216); spellPut(\, -16212); spellPut(\, -16205); spellPut(\, -16202); spellPut(\, -16187); spellPut(\, -16180); spellPut(\, -16171); spellPut(\, -16169); spellPut(\, -16158); spellPut(\, -16155); spellPut(\, -15959); spellPut(\, -15958); spellPut(\, -15944); spellPut(\, -15933); spellPut(\, -15920); spellPut(\, -15915); spellPut(\, -15903); spellPut(\, -15889); spellPut(\, -15878); spellPut(\, -15707); spellPut(\, -15701); spellPut(\, -15681); spellPut(\, -15667); spellPut(\, -15661); spellPut(\, -15659); spellPut(\, -15652); spellPut(\, -15640); spellPut(\, -15631); spellPut(\, -15625); spellPut(\, -15454); spellPut(\, -15448); spellPut(\, -15436); spellPut(\, -15435); spellPut(\, -15419); spellPut(\, -15416); spellPut(\, -15408);
spellPut(\, -15394); spellPut(\, -15385); spellPut(\, -15377); spellPut(\, -15375); spellPut(\, -15369); spellPut(\, -15363); spellPut(\, -15362); spellPut(\, -15183); spellPut(\, -15180); spellPut(\, -15165); spellPut(\, -15158); spellPut(\, -15153); spellPut(\, -15150); spellPut(\, -15149); spellPut(\, -15144); spellPut(\, -15143); spellPut(\, -15141); spellPut(\, -15140); spellPut(\, -15139); spellPut(\, -15128); spellPut(\, -15121); spellPut(\, -15119); spellPut(\, -15117); spellPut(\, -15110); spellPut(\, -15109); spellPut(\, -14941); spellPut(\, -14937); spellPut(\, -14933); spellPut(\, -14930); spellPut(\, -14929); spellPut(\, -14928); spellPut(\, -14926); spellPut(\, -14922); spellPut(\, -14921); spellPut(\, -14914); spellPut(\, -14908); spellPut(\, -14902); spellPut(\, -14894);
spellPut(\, -14889); spellPut(\, -14882); spellPut(\, -14873); spellPut(\, -14871); spellPut(\, -14857); spellPut(\, -14678); spellPut(\, -14674); spellPut(\, -14670); spellPut(\, -14668); spellPut(\, -14663); spellPut(\, -14654); spellPut(\, -14645); spellPut(\, -14630); spellPut(\, -14594); spellPut(\, -14429); spellPut(\, -14407); spellPut(\, -14399); spellPut(\, -14384); spellPut(\, -14379); spellPut(\, -14368); spellPut(\, -14355); spellPut(\, -14353); spellPut(\, -14345); spellPut(\, -14170); spellPut(\, -14159); spellPut(\, -14151); spellPut(\, -14149); spellPut(\, -14145); spellPut(\, -14140); spellPut(\, -14137); spellPut(\, -14135); spellPut(\, -14125); spellPut(\, -14123); spellPut(\, -14122); spellPut(\, -14112); spellPut(\, -14109); spellPut(\, -14099); spellPut(\, -14097);
spellPut(\, -14094); spellPut(\, -14092); spellPut(\, -14090); spellPut(\, -14087); spellPut(\, -14083); spellPut(\, -13917); spellPut(\, -13914); spellPut(\, -13910); spellPut(\, -13907); spellPut(\, -13906); spellPut(\, -13905); spellPut(\, -13896); spellPut(\, -13894); spellPut(\, -13878); spellPut(\, -13870); spellPut(\, -13859); spellPut(\, -13847); spellPut(\, -13831); spellPut(\, -13658); spellPut(\, -13611); spellPut(\,-13601); spellPut(\, -13406);
spellPut(\, -13404); spellPut(\, -13400); spellPut(\, -13398); spellPut(\, -13395); spellPut(\, -13391); spellPut(\, -13387); spellPut(\, -13383); spellPut(\, -13367); spellPut(\, -13359); spellPut(\, -13356); spellPut(\, -13343); spellPut(\, -13340); spellPut(\, -13329); spellPut(\, -13326); spellPut(\, -13318); spellPut(\, -13147);
spellPut(\, -13138); spellPut(\, -13120); spellPut(\, -13107); spellPut(\, -13096); spellPut(\, -13095); spellPut(\, -13091); spellPut(\, -13076); spellPut(\, -13068); spellPut(\, -13063); spellPut(\, -13060); spellPut(\, -12888); spellPut(\, -12875); spellPut(\, -12871); spellPut(\, -12860); spellPut(\, -12858); spellPut(\, -12852); spellPut(\, -12849); spellPut(\, -12838); spellPut(\, -12831); spellPut(\, -12829); spellPut(\, -12812); spellPut(\, -12802); spellPut(\, -12607); spellPut(\, -12597); spellPut(\, -12594); spellPut(\, -12585); spellPut(\, -12556); spellPut(\, -12359); spellPut(\, -12346); spellPut(\, -12320); spellPut(\, -12300); spellPut(\, -12120); spellPut(\, -12099); spellPut(\, -12089); spellPut(\, -12074); spellPut(\, -12067); spellPut(\, -12058); spellPut(\, -12039);
spellPut(\, -11867); spellPut(\, -11861); spellPut(\, -11847); spellPut(\, -11831); spellPut(\, -11798); spellPut(\, -11781); spellPut(\, -11604); spellPut(\, -11589); spellPut(\, -11536); spellPut(\, -11358); spellPut(\, -11340); spellPut(\, -11339); spellPut(\, -11324); spellPut(\, -11303); spellPut(\, -11097); spellPut(\, -11077); spellPut(\, -11067); spellPut(\, -11055); spellPut(\, -11052); spellPut(\, -11045); spellPut(\, -11041); spellPut(\, -11038); spellPut(\, -11024); spellPut(\, -11020); spellPut(\, -11019); spellPut(\, -11018); spellPut(\, -11014); spellPut(\, -10838); spellPut(\, -10832); spellPut(\, -10815); spellPut(\, -10800); spellPut(\, -10790); spellPut(\, -10780); spellPut(\, -10764); spellPut(\, -10587); spellPut(\, -10544); spellPut(\, -10533); spellPut(\, -10519);
spellPut(\, -10331); spellPut(\, -10329); spellPut(\, -10328); spellPut(\, -10322); spellPut(\, -10315); spellPut(\, -10309); spellPut(\, -10307); spellPut(\, -10296); spellPut(\, -10281); spellPut(\, -10274); spellPut(\, -10270); spellPut(\, -10262); spellPut(\, -10260); spellPut(\, -10256); spellPut(\, -10254); }
/**
* 获得单个汉字的Ascii. *
* @param cn
* char 汉字字符
* @return int 错误返回 0,否则返回ascii */
public static int getCnAscii(char cn) {
byte[] bytes = (String.valueOf(cn)).getBytes();
if (bytes == null || bytes.length > 2 || bytes.length <= 0) { // 错误
return 0; }
if (bytes.length == 1) { // 英文字符 return bytes[0]; }
if (bytes.length == 2) { // 中文字符 int hightByte = 256 + bytes[0]; int lowByte = 256 + bytes[1];
int ascii = (256 * hightByte + lowByte) - 256 * 256;
// System.out.println(\
return ascii; }
return 0; // 错误 }
/**
* 根据ASCII码到SpellMap中查找对应的拼音 *
* @param ascii
* int 字符对应的ASCII
* @return String 拼音,首先判断ASCII是否>0&<160,如果是返回对应的字符, *
* 否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音. */
public static String getSpellByAscii(int ascii) { if (ascii > 0 && ascii < 160) { // 单字符 return String.valueOf((char) ascii); }
if (ascii < -20319 || ascii > -10247) { // 不知道的字符 return null; }
Set keySet = spellMap.keySet(); Iterator it = keySet.iterator();
String spell0 = null; ;
String spell = null;
int asciiRang0 = -20319; int asciiRang;
while (it.hasNext()) {
spell = (String) it.next();
Object valObj = spellMap.get(spell); if (valObj instanceof Integer) {
asciiRang = ((Integer) valObj).intValue();
if (ascii >= asciiRang0 && ascii < asciiRang) { // 区间找到
return (spell0 == null) ? spell : spell0; } else {
spell0 = spell;
asciiRang0 = asciiRang; } } }
return null; }
/**
* 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换 *
* @param cnStr
* String 字符串
* @return String 转换成全拼后的字符串 */
public static String getFullSpell(String cnStr) { if (null == cnStr || \.equals(cnStr.trim())) { return cnStr; }
char[] chars = cnStr.toCharArray();
StringBuffer retuBuf = new StringBuffer();
for (int i = 0, Len = chars.length; i < Len; i++) { int ascii = getCnAscii(chars[i]); if (ascii == 0) { // 取ascii时出错 retuBuf.append(chars); } else {
String spell = getSpellByAscii(ascii);
if (spell == null) { retuBuf.append(chars); } else {
retuBuf.append(spell); } // end of if spell == null } // end of if ascii <= -20400 } // end of for
return retuBuf.toString(); }
/**
* 返回字符串的拼音的首字母,是汉字转化为全拼,其它字符不进行转换 *
* @param cnStr
* String 字符串
* @return String 转换成全拼后的字符串的首字母 */
public static String getFirstSpell(String cnStr) { if (cnStr.substring(0, 1).equals(\沣\)) return \;
if (cnStr.substring(0, 1).equals(\骊\)) return \;
if (cnStr.substring(0, 1).equals(\杈\)) return \;
if (cnStr.substring(0, 1).equals(\阿\)) return \;
if (cnStr.substring(0, 1).equals(\怡\)) return \;
if (cnStr.substring(0, 1).equals(\灞\)) return \; else
return getFullSpell(cnStr).substring(0, 1); }
/**
* 返回字符串的拼音的首字母的关键码值,是汉字转化为全拼,其它字符不进行转换 *
* @param cnStr
* String 字符串
* @return String 转换成全拼后的字符串的首字母的关键码值 这儿的关键码设为从0到26的数字 */
public static int getKey(String str) {
return +getFirstSpell(str).charAt(0) - 97; }
public static void main(String[] args) { String s = \;
System.out.println(getFirstSpell(s)); } }
Main1.xml:
xmlns:android=\ android:orientation=\ android:layout_width=\ android:layout_height=\> android:layout_width=\ android:layout_height=\/> android:layout_width=\ android:layout_height=\ /> android:layout_width=\ android:layout_height=\ android:hint=\输入城市名称(汉字或者拼音)\ />
android:layout_height=\ android:text=\查询\
AndroidManifest.xml要添加访问网络权限。内容如下:
package=\ android:versionCode=\ android:versionName=\> android:label=\> android:label=\> android:name=\ /> android:name=\ /> android:name=\>