当前位置:操作系统 > 安卓/Android >>

android使用百度地图、定位SDK实现地图和定位功能!(最新、可用+吐槽)

一、吐槽
在百度地图看了几个小时的教程,发现种种问题,很大部分是百度对于定位API 网页上的DEMO代码一大堆错误!这极可能是定位SDK升级后而网页上的DEMO部分代码沿用旧版导致的。
错误1:
 
在该示例中取了个变量叫mLocationClient,后面居然叫mLocClient,我找了半天,说这变量哪来的呢
 
错误2:
这个错误是最致命的,在网页上的DEMO(开发指南)里居然连开始定位这个函数至始至终都没调用过!!!
 
新手咋看以为调用这个就可以定位了,擦,其实还应该调用mLocClient.start(); 才行,否则压根就没启动定位。。。
 
二、使用百度地图V2.2和定位V4.0实现地图和定位功能
1、首先将必要的库文件导入到你的项目里,具体参看这里
http://developer.baidu.com/map/sdkandev-2.htm
http://developer.baidu.com/map/geosdk-android-developv4.0.htm
2、编写代码 (MainActivity.java)
 
package com.android.test;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
  
import com.baidu.location.BDLocation;  
import com.baidu.location.BDLocationListener;  
import com.baidu.location.LocationClient;  
import com.baidu.location.LocationClientOption;  
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 {  
  
    //百度Key  
    private static final String BD_KEY="请在这里输入你的百度地图Key,这里我删除了我自己的,你自己填";   
      
    //地图管理器  
    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(BD_KEY, null);   
          
        setContentView(R.layout.activity_main);  
     
        //注意:请在试用setContentView前初始化BMapManager对象,否则会报错    
        setContentView(R.layout.activity_main);    
        mMapView=(MapView)findViewById(R.id.bmapsView);    
        mMapView.setBuiltInZoomControls(true);    
        //设置启用内置的缩放控件    
        MapController mMapController=mMapView.getController();    
        // 得到mMapView的控制权,可以用它控制和驱动平移和缩放    
        GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));    
        //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)    
        mMapController.setCenter(point);//设置地图中心点    
        mMapController.setZoom(12);//设置地图zoom级别    
          
          
        ////////////////////////定位功能代码开始  
        mLocationClient=new LocationClient(this);  
        mLocationClient.setAK(BD_KEY);  
          
        myOverlay=new MyLocationOverlay(mMapView);  
        LocationClientOption option=new LocationClientOption();  
        option.setOpenGps(true);  
        option.setAddrType("all");//返回的定位结果包含地址信息  
        option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02  
          
        //当不设此项,或者所设的整数值小于1000(ms)时,采用一次定位模式。  
        //option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms  
        option.disableCache(true);//禁止启用缓存定位  
        option.setPoiNumber(5); //最多返回POI个数  
        option.setPoiDistance(1000); //poi查询距离  
        option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息   
        mLocationClient.setLocOption(option);  
        //注册位置监听  
        mLocationClient.registerLocationListener(locationListener);  
        if(mLocationClient!=null&&!mLocationClient.isStarted())  
        {  
            mLocationClient.requestLocation();  
            mLocationClient.start();  
        }  
        else  
            Log.e("LocSDK3", "locClient is null or not started");  
          
          
    }  
      
    private BDLocationListener locationListener=new 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;  
                 myOverlay.setData(data);  
                 //检查覆盖物是否存在,存在则修改,否则则添加  
                 if(mMapView.getOverlays().contains(myOverlay))  
                 {  
                     mMapView.getOverlays().set(myOverlayIndex,myOverlay);  
                 }  
                 else{  
                     myOverlayIndex=mMapView.getOverlays().size();  
                     mMapView.getOverlays().add(myOverlay);   
                 }  
                   
                   
                 GeoPoint geoPoint=new GeoPoint((int)(lat* 1E6),(int)(lon* 1E6));                  
                 mMapView.getController().setCenter(geoPoint);  
                               
                 mMapView.refresh();  
                 bmyLocal=false;  
             }  
             Log.e("定位结果:",sb.toString());  
        }  
    };  
      
    //创建菜单  
        @Override  
        public boolean onCreateOptionsMenu(Menu menu)  
        {  
            //组、ID、排序、菜单名  
  
            menu.add(0,1,1,"我的位置").setIcon(R.drawable.root_icon);  
      
            return true;  
        }  
          
        //处理菜单  
   
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,