定位使用了百度地图的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将自动进行扩充。
|