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

基于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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值