百度地图定位问题

来源:互联网 发布:苹果mac截屏怎么保存 编辑:程序博客网 时间:2024/04/29 14:42

一直没有写博客的习惯,感觉耗费时间,最近实验室有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());  
        }  
    };  
   
    
}

0 0
原创粉丝点击