为了要练习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