天气预报--定位更新天气

定位使用了百度地图的SDK,将locSDK4.0,jar加入libs文件夹下,并build path,就可以使用百度地图定位包了。这没啥好说的,我贴上一个百度SDK定位的Demo吧:


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

public class MainActivity extends Activity {
	private TextView mTv = null;
	public LocationClient mLocationClient = null;
	public MyLocationListenner myListener = new MyLocationListenner();
	public Button ReLBSButton=null;
	public static String TAG = "msg";


	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mTv = (TextView)findViewById(R.id.textview);
		ReLBSButton=(Button)findViewById(R.id.ReLBS_button);
		
		mLocationClient = new LocationClient( this );

		/**——————————————————————————————————————————————————————————————————
		 * 这里的AK和应用签名包名绑定,如果使用在自己的工程中需要替换为自己申请的Key
		 * ——————————————————————————————————————————————————————————————————
		 */
//		mLocationClient.setAK("697f50541f8d4779124896681cb6584d");	 
//		mLocationClient.setAK("z4nqERrqxnhNzT5VOGNVRt80");
		mLocationClient.registerLocationListener( myListener );

		setLocationOption();//设定定位参数
		
		mLocationClient.start();//开始定位
		
		// 重新定位
		ReLBSButton.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (mLocationClient != null && mLocationClient.isStarted())
					mLocationClient.requestLocation();
				else
					Log.d("msg", "locClient is null or not started");
			}
		});
		
	} 
	
	//设置相关参数
	private void setLocationOption(){
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);
		option.setAddrType("all");//返回的定位结果包含地址信息
		option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
		option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
		option.disableCache(true);//禁止启用缓存定位
		option.setPoiNumber(5);    //最多返回POI个数   
		option.setPoiDistance(1000); //poi查询距离        
		option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息        
		mLocationClient.setLocOption(option);
		
	} 

	@Override
	public void onDestroy() {
		mLocationClient.stop();//停止定位
		mTv = null;
		super.onDestroy();
	}

    /**
     * 百度基站定位错误返回码
     */
//  61 : GPS定位结果
//  62 : 扫描整合定位依据失败。此时定位结果无效。
//  63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
//  65 : 定位缓存的结果。
//  66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
//  67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
//  68 : 网络连接失败时,查找本地离线定位时对应的返回结果
//  161: 表示网络定位结果
//  162~167: 服务端定位失败。

	/**
	 * 监听函数,有更新位置的时候,格式化成字符串,输出到屏幕中
	 */
	public class MyLocationListenner implements BDLocationListener {
		@Override
		//接收位置信息
		public void onReceiveLocation(BDLocation location) {
			if (location == null)
				return ;
			StringBuffer sb = new StringBuffer(256);
			sb.append("time : ");
			sb.append(location.getTime());
			sb.append("\nerror code : ");
			sb.append(location.getLocType());
			sb.append("\nlatitude : ");
			sb.append(location.getLatitude());
			sb.append("\nlontitude : ");
			sb.append(location.getLongitude());
			sb.append("\nradius : ");
			sb.append(location.getRadius());
			sb.append("\nCity : ");
			sb.append(location.getCity());
			sb.append("\nProvince : ");
			sb.append(location.getProvince());
			if (location.getLocType() == BDLocation.TypeGpsLocation){
				sb.append("\nspeed : ");
				sb.append(location.getSpeed());
				sb.append("\nsatellite : ");
				sb.append(location.getSatelliteNumber());
			} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
				/**
				 * 格式化显示地址信息
				 */
				sb.append("\naddr : ");
				sb.append(location.getAddrStr());
			}
			sb.append("\nsdk version : ");
			sb.append(mLocationClient.getVersion());
			sb.append("\nisCellChangeFlag : ");
			sb.append(location.isCellChangeFlag());
			mTv.setText(sb.toString());
			Log.i(TAG, sb.toString());
		}
		//接收POI信息函数,我不需要POI,所以我没有做处理
		public void onReceivePoi(BDLocation poiLocation) {
			if (poiLocation == null) {
				return;
			}
		}
	}


}
如果手机有联网,会得到一个location的对象,用它的getCity()就可以得到你所在的城市名字,然后根据这个城市名字到之前保存的CityId表中获取到相应城市Id,然后就跟我们第一个功能实现类似了,联网解析Json然后更新UI。

这里唯一让我疑问的是StringBuffer,刚开始看这个Demo没看懂sb.append是什么意思,通过查资料知道了:

String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。

String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。

StringBuffer类的构造函数:public StringBuffer()       创建一个空的StringBuffer类的对象。

public StringBuffer( int length )         创建一个长度为 参数length 的StringBuffer类的对象。(如果参数length小于0,将触发NegativeArraySizeException异常。

StringBuffer append(boolean b)
这些方法都是向字符串缓冲区“追加”元素,但是,这个“元素”参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度,Java将自动进行扩充。
这样就明白了最后的setText(sb.toString());是什么意思了,将格式化的信息输出到textview中。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值