一直没有写博客的习惯,感觉耗费时间,最近实验室有Android的项目,因为以前做过这方面的一款小游戏,有点功底,但是以前的东西由于没有记下来所以还要再学习一遍,积累的经验都忘记了,所以现在都写下来,希望对大家也对自己有帮助。
开始说正题,地图定位花了我很长时间,刚开始用的是Google地图,后来发现Google在有的手机上能定位,有的又不能,让我好郁闷,后来又开始学百度地图,百度API给的不全面,在网上查了好多资料,花了大概2、3天的时间才搞定,和大家分享下。
1.加载包,在build path的library中加载baidumapapi_v2_4_0.jar包,在百度API官网有。在libs文件夹中加载如下几个包:这一点很重要。
2.申请API key,配置manifest.xml文件
在application中加入:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="SaSlHrwGS6HjEbmobI9RdPBv" /> 此处改成自己申请的key
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
在application外加一些权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET"/>
3.编写MainActivity代码:
package com.example.map_try;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;
public class MainActivity extends Activity {
private BDLocationListener myListener = new MyLocationListener();
//地图管理器
private BMapManager mBMapMan=null;
//地图视图
private MapView mMapView=null;
private LocationClient mLocationClient=null;
//我的位置覆盖物
private MyLocationOverlay myOverlay;
//位置在图层中的索引
private int myOverlayIndex=0;
//是否定位到我的位置
private boolean bmyLocal=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBMapMan=new BMapManager(getApplication());
mBMapMan.init("PoO3bG9U2L0AxXpeqW1VXpBX", null);
//注意:请在试用setContentView前初始化BMapManager对象,否则会报错
setContentView(R.layout.map);
mMapView=(MapView)findViewById(R.id.bmapView);
mMapView.setBuiltInZoomControls(true);
定位功能代码开始
mLocationClient=new LocationClient(getApplicationContext());
myOverlay=new MyLocationOverlay(mMapView);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);
//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
option.setAddrType("all");
mLocationClient.setLocOption(option);
//注册位置监听
mLocationClient.registerLocationListener(myListener);
mLocationClient.requestLocation();
mLocationClient.start();//开始定位
}
public class MyLocationListener implements BDLocationListener
{
@Override
public void onReceiveLocation(BDLocation arg0) {
Dispose(arg0);
}
@Override
public void onReceivePoi(BDLocation arg0) {
Dispose(arg0);
}
private void Dispose(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());
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());
}
//poiLocation
if(location.hasPoi()){
sb.append("\nPoi:");
sb.append(location.getPoi());
}else{
sb.append("\nnoPoi information");
}
//需要定位到我的位置?
if(bmyLocal)
{
double lat=location.getLatitude();
double lon=location.getLongitude();
LocationData data=new LocationData();
data.latitude=lat;
data.longitude=lon;
data.direction=2.0f;
Toast.makeText(MainActivity.this,lat+"",Toast.LENGTH_LONG).show();
Toast.makeText(MainActivity.this,lon+"",Toast.LENGTH_LONG).show();
myOverlay.setData(data);
//检查覆盖物是否存在,存在则修改,否则则添加
if(mMapView.getOverlays().contains(myOverlay))
{
mMapView.getOverlays().set(myOverlayIndex,myOverlay);
}
else{
myOverlayIndex=mMapView.getOverlays().size();
mMapView.getOverlays().add(myOverlay);
}
MapController mMapController=mMapView.getController();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint geoPoint=new GeoPoint((int)(lat* 1E6),(int)(lon* 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(geoPoint);//设置地图中心点
mMapController.setZoom(17);//设置地图zoom级别
mMapView.refresh();
bmyLocal=false;
Toast.makeText(MainActivity.this,location.getAddrStr(),Toast.LENGTH_LONG).show();
}
Log.e("定位结果:",sb.toString());
}
};
}