Android百度地图3.5.0 定位与覆盖物的添加(Location and Overlay)

来源:互联网 发布:上海君来 知乎 编辑:程序博客网 时间:2024/05/17 06:52

基于Android SDK v3.5.0的百度地图定位与覆盖物的添加。

先申请key http://lbsyun.baidu.com/apiconsole/key (先注册百度账号)
接着添加jar包 按照这个步骤来http://developer.baidu.com/map/index.php?title=androidsdk/guide/buildproject
(以上两步和以前的版本一模一样,我实在是懒得写了,有一点是jar包我直接放在libs下面,没有进行任何BuildingPath添加,直接出现在了Android Private Libraries中,然后就直接可以用了)
然后在清单配置文件里添加
一个是申请的key值,一个是定位服务

<application>       <meta-data          android:name="com.baidu.lbsapi.API_KEY"          android:value="开发者申请的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 android:name="android.permission.ACCESS_FINE_LOCATION" />      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />      <uses-permission android:name="android.permission.READ_PHONE_STATE" />      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />      <uses-permission android:name="android.permission.INTERNET" />      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />      <uses-permission android:name="android.permission.READ_LOGS" />  

XML文件

    <com.baidu.mapapi.map.MapView        android:id="@+id/id_bmapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"         android:clickable="true"/>

初始化百度地图

SDKInitializer.initialize(this);

这句话写在Application(推荐)和MainActivity中都可以,但是要在setContentView()之前
例:

public class MyApplication extends Application{    @Override    public void onCreate() {        super.onCreate();        SDKInitializer.initialize(this);    }}或者protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 注意该方法要再setContentView方法之前实现        SDKInitializer.initialize(getApplicationContext());        setContentView(R.layout.activity_main);        ....}

准备工作结束,接下来是正文!

//OnGetGeoCoderResultListener这个地理编码的监听既可以实现接口,也可以setlistener 内部匿名类实现public class MainActivity extends Activity implements OnGetGeoCoderResultListener{    public MapView mapView = null;    public BaiduMap baiduMap = null;    GeoCoder search = null;    // 定位相关声明    public LocationClient locationClient = null;    //自定义图标    boolean isFirstLoc = true;// 是否首次定位    private static String city = "深圳市";    private static String addr1 = "深圳大学";    private static String addr2 = "维用大厦";    private static String addr3 = "桑达科技大厦";    private static String addr4 = "科苑西小区 ";    private static String addr5 = "科技工业大厦";    private static List<infoEntity> infoList = new ArrayList<infoEntity>();    static {        infoList.add(new infoEntity(city, addr1));        infoList.add(new infoEntity(city, addr2));        infoList.add(new infoEntity(city, addr3));        infoList.add(new infoEntity(city, addr4));        infoList.add(new infoEntity(city, addr5));    }    public BDLocationListener myListener = new BDLocationListener() {        @Override        public void onReceiveLocation(BDLocation location) {            // mapview 销毁后不在处理新接收的位置            if (location == null || mapView == null)                return;            MyLocationData locData = new MyLocationData.Builder()            .accuracy(location.getRadius())            // 此处设置开发者获取到的方向信息,顺时针0-360            .direction(100).latitude(location.getLatitude())            .longitude(location.getLongitude()).build();            baiduMap.setMyLocationData(locData);    //设置定位数据            if (isFirstLoc) {                isFirstLoc = false;                LatLng ll = new LatLng(location.getLatitude(),                        location.getLongitude());                MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16);   //设置地图中心点以及缩放级别                baiduMap.animateMapStatus(u);            }            // 遍历集合多次监听 添加覆盖物            for(int i=0;i<infoList.size();i++){                search = GeoCoder.newInstance();                search.setOnGetGeoCodeResultListener(MainActivity.this);                //这是一个自己写的实体类 只包含两个参数 String city 和String address                infoEntity entity = infoList.get(i);                String c = entity.getCity();                String a = entity.getAddress();                search.geocode(new GeoCodeOption().city(c).address(a));            }        }     };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 在使用SDK各组件之前初始化context信息,传入ApplicationContext        // 注意该方法要再setContentView方法之前实现        SDKInitializer.initialize(getApplicationContext());        setContentView(R.layout.activity_main);        mapView = (MapView) this.findViewById(R.id.id_bmapView); // 获取地图控件引用        mapView.removeViewAt(1);   //删除百度地图Logo(若作为商用软件最好不要删除logo,百度会追责)        //获取地图控制器        baiduMap = mapView.getMap();        //设置地图初始缩放        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f);        baiduMap.setMapStatus(msu);        //开启定位图层        baiduMap.setMyLocationEnabled(true);        locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类        locationClient.registerLocationListener(myListener); // 注册监听函数        setLocationOption();   //设置定位参数        locationClient.start(); // 开始定位    }    //反地理编码(坐标->地址)    @Override    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {    }    //地理编码 (地址->坐标)    @Override    public void onGetGeoCodeResult(GeoCodeResult result) {        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {            Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)            .show();            return;        }        //添加覆盖物        baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())                .icon(BitmapDescriptorFactory                        .fromResource(R.drawable.icon2)));    }    private void setLocationOption() {        LocationClientOption option = new LocationClientOption();        option.setOpenGps(true); // 打开GPS        option.setServiceName("com.baidu.location.service_v2.9");//这一句加和不加好像都行,可能新版本内置了        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式        option.setCoorType("bd09ll"); // 返回的定位结果是百度经纬度,默认值gcj02        option.setScanSpan(5000); // 设置发起定位请求的间隔时间为5000ms        option.setIsNeedAddress(true); // 返回的定位结果包含地址信息        option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向        locationClient.setLocOption(option);            }    @Override    protected void onDestroy() {        super.onDestroy();        locationClient.stop();        // 关闭定位图层        baiduMap.setMyLocationEnabled(false);        mapView.onDestroy();    }}

效果图
图片有点大啊。。。

以上就是主要代码了,还有一个实体类没粘,因为我太懒了,而且文章有点长,就不粘了,后面有项目源码,不要分的,欢迎下载!

代码写的很烂的,静态代码块那部分主要是为了模拟从其他地方传过来的地址信息,其中还有很多需要改进的地方,希望各位猿友指出批评,在此先谢过大家!

点击下载项目

1 0