Android天气类app实现

为了要练习Android开发,打算写一些app作为练习项目,第一个写的是手机拨号器,实现了手机系统拨号应用的常用基本功能,由于比较简单,所以就不写到博客里了。这个是第二个项目,实现了手机天气应用的基本功能,运行截图如下

                                                        

                                    图1                                                                                                           图2                                                                                                           图3 

需要实现的主要功能有:天气数据获取;城市定位;城市切换 下面开始逐一说明:

一、天气数据获取

我这里用的是百度提供的API,注册并下载百度开发者的SDK,再按照demo里的调用示例,即可获得所要查询城市天气数据

首先新建一个类继承自Application类,在类中实现SDK的初始化,并在项目配置文件AndroidManifest.xml中application标签下android:name中指定该类,application中代码如下:

public class MyApplication extends Application {
      public LocationService locationService;
    public Vibrator mVibrator;
    private static MyApplication instance;
    @Override
    public void onCreate() {
        ApiStoreSDK.init(this,"您的apikey");
        locationService =new LocationService(getApplicationContext());
        mVibrator=(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
        SDKInitializer.initialize(getApplicationContext());
        instance=this;
        super.onCreate();
    }
    public static MyApplication getInstance(){
        return instance;
    }
}

与此功能相关的代码为 ApiStoreSDK.init(this,"您的apikey");

在类中接口调用的代码为:

    Parameters para=new Parameters();
                        para.put("city",city);
                        ApiStoreSDK.execute("http://apis.baidu.com/heweather/weather/free",ApiStoreSDK.GET,
                                para,new ApiCallBack(){
                                    @Override
                                    public void onSuccess(int i, String s) {
                                        super.onSuccess(i, s);
                                  //字符串s即为查询所获得数据,具体解析看查看API文档
      }});}

二、城市定位

实现这个功能时遇到的麻烦最多,一开始的想法是通过Android自带的LOCATION_SERVICE功能取得位置数据,但是在调用

locationManager.getLastKnownLocation方法时返回的Location总是为null,查了资料有的说是与手机有关,有的说是因为无法使用Google服务,于是果断换百度的定位SDK。仿照demo中的代码实现一个简单的定位,但在执行SDKInitializer.initialize(getApplication())这句时都会报错,一开始以为是自己代码的问题,调试了半天还是无法解决。仔细看错误原因才发现是因为没有添加.so文件,只添加了jar包,添加之后依然报相同的错误,那就是添加.so文件失败了。在网上找了好多方法都无法成功,最终决定索性用最简单的方法试一试,首先在libs目录下添加armeabi及arm64-8a目录(这是我所用到的,不同版本及功能添加 的不同),将自己所需要的.so文件复制进去,如下图所示

之后在build.gradle文件中添加如下一句:

 compile fileTree(include: ['*.jar'], dir: 'libs');

点击build->make project,之后再次运行,发现错误已解决,并可以取得正确数据

其中application类中的相关代码为

        locationService =new LocationService(getApplicationContext());
        mVibrator=(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
        SDKInitializer.initialize(getApplicationContext());

java类中的相关代码为:

        locationService = ((MyApplication) getApplication()).locationService;
        locationService.registerListener(mListener);
        locationService.setLocationOption(locationService.getDefaultLocationClientOption());

        locationService.start();

private BDLocationListener mListener = new BDLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub
            if (null != location && location.getLocType() != BDLocation.TypeServerError) {
                city=location.getCity();
              if (city.contains("市")){
                 city=city.replace("市","");
              }}}};

三、城市切换 

在图2所示界面可选择所要查询的城市,点击之后将此城市存入数据库,在图3所示界面可对选择过的城市列表进行管理,在图1所示界面中通过手势的左右滑动,可以实现不同城市间的转换,此功能通过ViewPager+Fragment组合实现。

这里有一点要说明,在滚动ViewPager时,为了保存Fragment的状态,防止被初始化,将适配器adapter继承自FragmentStatePagerAdapter即可

项目地址:https://github.com/CoderZWei/WeatherApp

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值