Android Studio 调用百度地图SDK 实现获取当前定位

首先我们需要实现调用百度地图的SKD,可以参考:Android Studio 调用百度地图SDK

之前成功调用了百度地图,但是打开默认是天安门的,不能定位

那么现在就来实现一下定位的功能吧

这里需要去百度开放平台下载全量的定位包SDK

 

然后只需要修改之前的MainActivity.java文件

package com.map.baidumap;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
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.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import java.util.ArrayList;
import java.util.List;

/*
 * @author vv
 * @website www.iotword.com
 * create at 2018/9/27
 * description: 千里之行始于足下~
 */
public class MainActivity extends Activity {


    //地图控件
    public MapView mapView = null;
    //百度地图对象
    public BaiduMap baiduMap = null;
    //定位相关声明
    public LocationClient locationClient = null;
    //自定义图标
    BitmapDescriptor mCurrentMarket = null;
    //是否首次定位
    boolean isFirstLoc = true;

    //得到经纬度
    private double longitude;
    private double latitude;
    private MyLocationListener myLitenner = new MyLocationListener();

    private class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {

            longitude = location.getLongitude();
            latitude = location.getLatitude();
            boolean isLocateFailed = false;//定位是否成功
            //MAP VIEW 销毁后不在处理新接收的位置
            if (location == null || mapView == null)
                return;
            MyLocationData locData = new MyLocationData.Builder()
                    //此处设置开发者获取到的方向信息,顺时针0-360
                    .accuracy(location.getRadius())
                    .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 mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(ll, 16);
                //设置地图中心点以及缩放级别
                baiduMap.animateMapStatus(mapStatusUpdate);

            }

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK个组件之前初始化context信息,传入ApplicationContext
        //注意改方法在在setContextView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initData() {
        locationClient.start();//开始定位
        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//设置为一般地图
        //baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);//设置为卫星地图
        baiduMap.setTrafficEnabled(true);//开启交通图


    }

    private void initView() {
        mapView = (MapView) findViewById(R.id.bmapView);
        baiduMap = mapView.getMap();
        //开启定位图层
        baiduMap.setMyLocationEnabled(true);
        locationClient = new LocationClient(getApplicationContext());//实例化LocationClient类
        locationClient.registerLocationListener(myLitenner);//注册监听函数
        this.setLocationOption();//设置定位参数
    }

    //三个状态实现地图生命周期管理
    @Override
    protected void onDestroy() {
        //退出销毁
        locationClient.stop();
        baiduMap.setMyLocationEnabled(false);
        super.onDestroy();
        mapView.onDestroy();
        mapView = null;
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    /**
     * 设置定位参数
     */
    private void setLocationOption() {
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);//打开GPS
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置定位模式
        option.setCoorType("gcj02");//返回的定位结果是百度经纬度,默认值是gcj02
        option.setScanSpan(5000);//设置发起定位请求的时间间隔为5000ms
        option.setIsNeedAddress(true);//返回的定位结果饱饭地址信息
        option.setNeedDeviceDirect(false);// 返回的定位信息包含手机的机头方向

        locationClient.setLocOption(option);
    }



}




将MainActivity.java代码替换完成后,build,并运行

就可以获取到当前位置,并且在当前位置处会有一个原点标记

物联沃分享整理
物联沃-IOTWORD物联网 » Android Studio 调用百度地图SDK 实现获取当前定位

发表评论