android中获取即时天气

来源:互联网 发布:dw软件代码 编辑:程序博客网 时间:2024/05/29 17:56

先看效果:



需求非常简单,在菜单中加入天气查询的按钮,点击后显示即时天气。


准备工作:

1.下载华为能力SDK;http://imax.vmall.com/nj-campus/universityEpDown/toDownPage

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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_weather);sdkStatus=false;myHandler=new MyHandler();  //初始化业务接口实例weather = CapabilityService.getWeatherServiceInstance();//实例化CommonServicecs=CommonService.getInstance();initSDK();}private void initSDK(){//应用ID,请去iMAX平台注册申请String appId="******";//应用KeyString 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); }});}@Overridepublic 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(); }elseToast.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;i<tmp.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.dismiss();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" />

 增强版

光用文字表现力还是不够,下面来实现图片显示天气情况。

思路就是根据返回的结果字段,更新imageview。

首先在res/drwable中添加一些表示天气的图片:


在主界面中添加一个ImageView空间。

修改 private void showResult(String s)函数。

 /** 显示结果 */        private void showResult(String s) {            String tmp[]=s.split("\"");          for(int i=0;i<tmp.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]+s).show();        int weatherCode = Integer.parseInt(tmp[13]);        switch(weatherCode){        case 26:        case 27:        case 28:        case 29:        case 30:        case 44:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.cloudy));        break;        case 20:        case 22:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.foggy));        break;        case 21:        case 19:        case 23:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.dusty));        break;        case 24:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.windy));        break;        case 36:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.hot));        break;        case 13:        case 14:        case 15:        case 16:        case 43:        case 46:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.snow));        break;        case 3:        case 4:        case 37:        case 38:        case 39:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.thunderstorms));        break;        case 11:        case 12:        case 40:        case 45:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.showers));        break;        case 5:        case 6:        case 7:        case 18:        case 35:        case 41:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.mixrainandsnow));        break;        case 32:        case 34:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.sunny));        break;        case 8:        case 9:        case 10:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.freezerain));        break;        case 17:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.hail));        break;        case 1:        case 2:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.tornado));        break;        case 25:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.cold));        break;        case 31:        case 33:        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.clear));        break;        default:;        }                }    

效果如下:




原创粉丝点击