1、首先获取位置(坐标或城市),可以使用百度地图API、高德地图API
2、利用坐标或城市获取天气。需要使用三方天气API。例如:Mob天气接口、天气接口、聚合数据接口、国家气象局
准备工作:
1.下载华为能力SDK;
2.申请一个应用获取appId和appkey,待会要用到。
简单的思路就是先通过 *** 或者gps获取到当前位置的经纬度,然后通过sdk查询温度,获取结果。
具体步骤如下:
1.创建工程
把sdk中jar包拖到工程中的libs文件夹下面。
2.主类代码如下
package com.empty.weatherreport;
import com.empty.weatherreport.WeatherUtil.SCell;
import com.empty.weatherreport.WeatherUtil.SItude;
import com.imax.vmall.sdk.android.common.adapter.ServiceCallback;
import com.imax.vmall.sdk.android.entry.CapabilityService;
import com.imax.vmall.sdk.android.entry.CommonService;
import com.imax.vmall.sdk.android.huawei.weather.WeatherService;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
public class WeatherActivity extends Activity {
private MyHandler myHandler;
private ProgressDialog mProgressDialog;
private Location mLocation;
private boolean sdkStatus;
//Tool to get weather
/**
* CommonService
*/
private CommonService cs;
/**
* WeatherService
*/
private WeatherService weather;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather);
sdkStatus=false;
myHandler=new MyHandler();
//初始化业务接口实例
weather = CapabilityService.getWeatherServiceInstance();
//实例化CommonService
cs=CommonService.getInstance();
initSDK();
}
private void initSDK()
{
//应用ID,请去iMAX平台注册申请
String appId="******";
//应用Key
String appKey="******";
//通过CommonService调用鉴权接口,在调用其它能力前必须保证鉴权初始化成功
cs.init(WeatherActivity.this,appId, appKey, new ServiceCallback() {
public void onError(String arg0) {
// TODO Auto-generated method stub
//设置消息
Message msg = new Message();
msg = new Message();
msg.what = 2;
msg.obj = "SDK initialize failed!";
myHandler.sendMessage(msg);
}
public void onComplete(String arg0) {
// TODO Auto-generated method stub
//设置消息
Message msg = new Message();
msg = new Message();
msg.what = 2;
msg.obj = "SDK initialize success!";
sdkStatus=true;
myHandler.sendMessage(msg);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_weather, menu);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId()==R.id.menu_settings) Toast.makeText(getApplicationContext(), "Ha", Toast.LENGTH_SHORT).show();
if(item.getItemId()==R.id.menu_weather)
{
if(sdkStatus)
{
/** 弹出一个等待状态的框 */
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Waiting...");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.show();
WeatherThread m = new WeatherThread();
new Thread(m).start();
}
else
Toast.makeText(getApplicationContext(), "SDK not installed", Toast.LENGTH_SHORT).show();
}
return super.onMenuItemSelected(featureId, item);
}
/** 显示结果 */
private void showResult(String s) {
String tmp[]=s.split("\"");
for(int i=0;itmp.length;i++)
Log.i("tmp"+i, tmp[i]);
new AlertDialog.Builder(this) .setTitle("Weather") .setMessage("latitude:"+mLocation.getLatitude()+"\n longitude:"
+mLocation.getLongitude()+"\ntmperature:"+tmp[21]) .show();
}
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// 子类必须重写此 *** ,接管数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.d("MyHandler", "handleMessage......");
/** 显示结果 */
switch(msg.what)
{
case 1:
Log.i("Error", "case1");
mProgressDialog.di *** iss();
showResult((String)msg.obj);
break;
case 2:
Toast.makeText(getApplicationContext(), (String)msg.obj, Toast.LENGTH_SHORT).show();
break;
default:;
}
super.handleMessage(msg);
// 此处可以更新UI
}
}
class WeatherThread implements Runnable {
public void run() {
final Message msg = new Message();
msg.what=1;
try {
mLocation=getLocation(WeatherActivity.this);
weather.getWeather(Double.toString(mLocation.getLongitude()),Double.toString(mLocation.getLatitude()), new ServiceCallback()
{
public void onError(String arg0)
{
//api接口调用错误响应
Log.i("Error", "getWeather error:"+arg0);
//设置消息
msg.obj = arg0;
/** 关闭对话框 */
myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
public void onComplete(String arg0)
{
//api接口调用成功响应
Log.i("Complete", "getWeather complete:"+arg0);
//设置消息
msg.obj = arg0;
/** 关闭对话框 */
myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//Get the Location by GPS or WIFI
public Location getLocation(Context context) {
LocationManager locMan = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
Location location = locMan
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null) {
location = locMan
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
return location;
}
}
3.载manifest文件中添加权限
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
/uses-permission
uses-permission android:name="android.permission.INTERNET"
/uses-permission
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
/uses-permission
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /
uses-permission android:name="android.permission.READ_PHONE_STATE" /
使用搜索引擎可以得到很多的天气预报接口,这里以某个api为例
参数为city=城市名称
尝试获取南昌的天气预报
南昌
得到下面xml数据
?xml version="1.0" encoding="utf-8"?
resp
city南昌/city
updatetime16:55/updatetime
wendu5/wendu
fengli3级/fengli
shidu90%/shidu
fengxiang北风/fengxiang
sunrise_106:54/sunrise_1
sunset_117:19/sunset_1
sunrise_2/
sunset_2/
environment
aqi26/aqi
pm2513/pm25
suggest各类人群可自由活动/suggest
quality优/quality
MajorPollutants/
o344/o3
co1/co
pm1014/pm10
so24/so2
no227/no2
time16:00:00/time
/environment
yesterday
date_14日星期五/date_1
high_1高温 11℃/high_1
low_1低温 7℃/low_1
day_1
type_1阴/type_1
fx_1无持续风向/fx_1
fl_1微风/fl_1
/day_1
night_1
type_1小到中雨/type_1
fx_1北风/fx_1
fl_13-4级/fl_1
/night_1
/yesterday
forecast
weather
date5日星期六/date
high高温 7℃/high
low低温 5℃/low
day
type中到大雨/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/day
night
type小到中雨/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/night
/weather
weather
date6日星期天/date
high高温 10℃/high
low低温 5℃/low
day
type阴/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/day
night
type多云/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/night
/weather
weather
date7日星期一/date
high高温 13℃/high
low低温 6℃/low
day
type多云/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/day
night
type晴/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/night
/weather
weather
date8日星期二/date
high高温 13℃/high
low低温 7℃/low
day
type晴/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/day
night
type多云/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/night
/weather
weather
date9日星期三/date
high高温 13℃/high
low低温 10℃/low
day
type小雨/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/day
night
type小雨/type
fengxiang无持续风向/fengxiang
fengli微风级/fengli
/night
/weather
/forecast
zhishus
zhishu
name晨练指数/name
value不宜/value
detail有较强降水,请避免户外晨练,建议在室内做适当锻炼,保持身体健康。/detail
/zhishu
zhishu
name舒适度/name
value较舒适/value
detail白天有雨,人们会感到有些凉意,但大部分人完全可以接受。/detail
/zhishu
zhishu
name穿衣指数/name
value较冷/value
detail建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。/detail
/zhishu
zhishu
name感冒指数/name
value极易发/value
detail将有一次强降温过程,天气寒冷,且空气湿度较大,极易发生感冒,请特别注意增加衣服保暖防寒。/detail
/zhishu
zhishu
name晾晒指数/name
value不宜/value
detail有较强降水,不适宜晾晒。若需要晾晒,请在室内准备出充足的空间。/detail
/zhishu
zhishu
name旅游指数/name
value较不宜/value
detail天气稍凉,有微风,同时有有较强降水,会给出行产生很多麻烦,建议好还是多选择在室内活动!。/detail
/zhishu
zhishu
name紫外线强度/name
value最弱/value
detail属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。/detail
/zhishu
zhishu
name洗车指数/name
value不宜/value
detail不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。/detail
/zhishu
zhishu
name运动指数/name
value较不宜/value
detail有较强降水,建议您选择在室内进行健身休闲运动。/detail
/zhishu
zhishu
name约会指数/name
value不适宜/value
detail较强降水天气会给室外约会增添许多麻烦,尽量不要外出约会,更好在室内促膝谈心。/detail
/zhishu
zhishu
name雨伞指数/name
value带伞/value
detail有较强降水,您在外出的时候一定要带雨伞,以免被雨水淋湿。/detail
/zhishu
/zhishus
/resp
得到数据后使用XML解析数据即可,更好是建立一个实体类来存储数据
下面是使用DOM方式解析部分数据代码
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//is是 *** 连接得到的输入流
Document doc = builder.parse(is);
if(doc==null) throw new Exception();
Element element = doc.getDocumentElement();
NodeList childList = element.getChildNodes();
for(int i=0; ichildList.getLength(); i++){
Element e = (Element) childList.item(i);
String tag = e.getTagName();
String text = e.getTextContent();
if("city".equals(tag)){
//城市
}else if("updatetime".equals(tag)){
//更新时间
}else if("wendu".equals(tag)){
//即时温度
}else if("fengli".equals(tag)){
//风力
}else if("shidu".equals(tag)){
//湿度
}else if("fengxiang".equals(tag)){
//风向
}
}
3 月 24 日,欧盟管理机构宣布《数字市场法案》(Digital Markets Act,简称DMA)已达成共识,将会对欧洲的大型科技公司进行全面的监管。作为一项具有深远影响的雄心勃勃的法律,该法案中最引人注目的措施将要求每个大型科技公司(在欧盟拥有超过 750 亿欧元的市值或超过 4500 万人...
SSLPing 是一款相当实用的工具,在注册并添加了你的服务器后,它就会帮助检查证书、协议、密码和已知漏洞。从 SSL v3 到 TLS 1.2,对于一些大型服务提供商来说,如果未能在证书到期前妥善处理,后续的影响还是相当难以规避的。然而近日,这款免费工具的创作者正在发出寻求帮助的讯号。 (来自:...
乌克兰计算机应急响应小组(CERT-UA)在周二的一份安全公告中称,他们刚刚破坏了 Sandworm 想要攻陷一家该国能源供应商的企图。据说 Sandworm 是一个与俄罗斯军事情报部门有关联的黑客组织,期间试图利用臭名昭著的新版 Industroyer 恶意软件,来切断未具名的某能源供应商的变电站...
丰田汽车旗下零部件制造商日本电装于13日宣布,其德国当地法人受到了网络攻击。该公司确认其网络感染了勒索软件。被认定发动了此次攻击的黑客集团已经发布了勒索声明。公司称虽然目前并没有立刻对公司经营造成影响,但是“关于受害的详细情况正在调查中”。公司已向德国当地政府提交了受害报告。 据信息安全公司三井物...
美国联邦调查局警告食品和农业公司,要做好准备,防止勒索软件操作者在播种和收获季节攻击农业实体。联邦调查局的警告指出,以前在这些季节对6个粮食合作社的勒索软件攻击是在2021年秋收期间进行的,2022年初的两次攻击可能通过破坏种子和化肥的供应而影响种植季节。 “网络犯罪分子可能将农业合作社视为有利可...
根据美国财政部公布的最新报告,2021 年上半年勒索事件支付的赎金总额将近 6 亿美元,轻松超过了 2020 年全年的总额。该报告由财政部金融犯罪执法网络周五发布,重点提及了今年发生了几起高调的勒索软件攻击事件,包括 Colonial Pipeline 和肉类加工厂 JBS USA Holdings...