Android中第三方SDK集成之百度地图集成(案例一)

编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/72083693

技术要点

  • 调用普通地图
  • 调用卫星地图
  • 调用实时交通图
  • 回到我的位置
  • 普通定位模式
  • 跟随定位模式
  • 罗盘定位模式
  • 以及添加覆盖物

Demo展示图片

Android中第三方SDK集成之百度地图集成(案例一)_第1张图片

基本环境配置不清楚可回顾:

  Android中第三方SDK集成之百度地图集成_入门篇http://blog.csdn.net/zxc514257857/article/details/69768308

AndroidManifest文件配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.test.baidumap">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="0bOPfMsCXthtWWqNMTpU23G8GfP4eukv" />

        <activity android:name=".activity.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            intent-filter>
        activity>

        <service android:name="com.baidu.location.f"
                 android:enabled="true"
                 android:process=":remote">
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.9"/>
            intent-filter>
        service>

    application>
manifest>

布局文件代码:

//(layout)activity_main.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.baidumap.activity.MainActivity">

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

    <RelativeLayout
        android:id="@+id/id_maker_ly"
        android:layout_width="match_parent"
        android:layout_height="220dp"
        android:layout_alignParentBottom="true"
        android:background="#cc4e5a6b"
        android:clickable="true"
        android:visibility="gone" >

        <ImageView
            android:id="@+id/id_info_img"
            android:layout_width="fill_parent"
            android:layout_height="150dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="12dp"
            android:layout_marginRight="12dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/img_border"
            android:scaleType="fitXY"
            android:src="@mipmap/pic1" >
        ImageView>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="@mipmap/bg_map_bottom" >

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="20dp"
                android:orientation="vertical" >

                <TextView
                    android:id="@+id/id_info_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="老米家泡馍"
                    android:textColor="#fff5eb" />

                <TextView
                    android:id="@+id/id_info_distance"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="距离200米"
                    android:textColor="#fff5eb" />
            LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="20dp"
                android:orientation="horizontal" >

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@mipmap/thumb"
                    android:clickable="true" />

                <TextView
                    android:id="@+id/thumb"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:text="789"
                    android:textColor="#fff5eb" />
            LinearLayout>
        RelativeLayout>
    RelativeLayout>
RelativeLayout>
-------------------------------------------------------------------
//(drawable)img_border.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <stroke
        android:width="2dp"
        android:color="#AAFFFFFF" />

    <padding
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp" >
    padding>
shape>
-------------------------------------------------------------------
//(menu)main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/commonMap"
        android:showAsAction="never"
        android:title="普通地图"/>

    <item
        android:id="@+id/siteMap"
        android:showAsAction="never"
        android:title="卫星地图"/>

    <item
        android:id="@+id/trafficMap"
        android:showAsAction="never"
        android:title="实时交通图(off)"/>

    <item
        android:id="@+id/myLocation"
        android:showAsAction="never"
        android:title="回到我的位置"/>

    <item
        android:id="@+id/normalLocation"
        android:showAsAction="never"
        android:title="普通定位模式"/>

    <item
        android:id="@+id/followLocation"
        android:showAsAction="never"
        android:title="跟随定位模式"/>

    <item
        android:id="@+id/compassLocation"
        android:showAsAction="never"
        android:title="罗盘定位模式"/>

    <item
        android:id="@+id/addOverLay"
        android:showAsAction="never"
        android:title="添加覆盖物"/>

menu>

activity文件代码:

//(activity)MainActivity
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
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.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapPoi;
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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.test.baidumap.R;
import com.test.baidumap.bean.Info;
import com.test.baidumap.listener.MyOrientationListener;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mMapView = null;
    private BaiduMap mBaiduMap;
    private Context mContext = MainActivity.this;

    //定位相关
    private LocationClient mLocationClient;
    private MyLocationListener mLocationListener;
    // 第一次定位
    private boolean isFirstIn = true;
    // 记录注最新的经纬度
    private double mlongitude;
    private double mLatitude;
    // 记录自己的定位地址
    private String mAddrStr;
    // 自定义定位图标
    private BitmapDescriptor mIconLocation;
    // 实例化MyOrientationListener
    private MyOrientationListener mOrientationListener;
    // 记录当前方向图标的位置
    private float mCurrentX;
    // 记录定位模式
    private MyLocationConfiguration.LocationMode mLocationMode;

    //覆盖物相关
    private BitmapDescriptor mMarker;
    private RelativeLayout mMarkerLy;

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

    private void initView(){
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
    }

    private void initData(){
        mBaiduMap = mMapView.getMap();

        // 设置百度地图的缩放等级为15 在左下角显示为500m
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        mBaiduMap.setMapStatus(msu);

        // 定位相关
        initLocation();

        // 覆盖物相关
        initMarker();
    }

    /**
     * 定位相关
     */
    private void initLocation() {
        // 设置定位
        mLocationClient = new LocationClient(this);
        mLocationListener = new MyLocationListener();
        // 注册定位监听
        mLocationClient.registerLocationListener(mLocationListener);

        LocationClientOption option = new LocationClientOption();
        // 设置坐标类型
        option.setCoorType("bd09ll");
        // 设置打开GPS
        option.setOpenGps(true);
        // 设置需要返回当前位置
        option.setIsNeedAddress(true);
        // 设置请求间隔时间
        option.setScanSpan(1000);
        mLocationClient.setLocOption(option);

        // 设置定位图标
        mIconLocation = BitmapDescriptorFactory.fromResource(R.mipmap.arrow);

        // 创建方向传感监听器
        mOrientationListener = new MyOrientationListener(mContext);
        // 设置方向传感的回调
        mOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
            @Override
            // 更新地图上方向图标的位置
            public void onOrientationChanged(float x) {
                mCurrentX = x;
            }
        });

        // 默认的定位模式为普通模式
        mLocationMode = MyLocationConfiguration.LocationMode.NORMAL;
    }

    /**
     * 覆盖物相关
     */
    private void initMarker() {
        mMarker = BitmapDescriptorFactory.fromResource(R.mipmap.marker);
        mMarkerLy = (RelativeLayout) findViewById(R.id.id_maker_ly);
        //添加marker的点击事件
        mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener(){
            @Override
            public boolean onMarkerClick(Marker marker) {
                Bundle bundle = marker.getExtraInfo();
                Info info = (Info) bundle.getSerializable("info");
                ImageView iv = (ImageView)mMarkerLy.findViewById(R.id.id_info_img);
                TextView distance = (TextView)mMarkerLy.findViewById(R.id.id_info_distance);
                TextView name = (TextView)mMarkerLy.findViewById(R.id.id_info_name);
                TextView thumb = (TextView)mMarkerLy.findViewById(R.id.thumb);
                //赋值显示
                iv.setImageResource(info.getImgId());
                distance.setText(info.getDistance());
                name.setText(info.getName());
                thumb.setText(info.getThumb() + "");

                TextView tv = new TextView(mContext);
                tv.setBackgroundResource(R.mipmap.location_tips);
                tv.setPadding(50,20,50,20);
                tv.setText(info.getName());
                tv.setTextColor(Color.WHITE);
                //显示商家信息的弹框
                InfoWindow infoWindow;
                BitmapDescriptor bitmapDescriptor =BitmapDescriptorFactory.fromView(tv);

                //将经纬度转化为屏幕上的点
                LatLng latLng = marker.getPosition();
                Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
                // 再将点转化为经纬度
                LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
                infoWindow = new InfoWindow(bitmapDescriptor, ll, -47,
                        new InfoWindow.OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick() {
                        mBaiduMap.hideInfoWindow();
                    }
                });

                mBaiduMap.showInfoWindow(infoWindow);
                mMarkerLy.setVisibility(View.VISIBLE);
                return true;
            }
        });

        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                // 点击其他区域 店铺信息消失
                mMarkerLy.setVisibility(View.GONE);
                // 点击其他区域 弹框消失
                mBaiduMap.hideInfoWindow();
            }

            @Override
            public boolean onMapPoiClick(MapPoi mapPoi) {
                return false;
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onStart() {
        super.onStart();
        // 开启定位
        mBaiduMap.setMyLocationEnabled(true);
        if(!mLocationClient.isStarted()){
            mLocationClient.start();
        }

        //开启方向传感器
        mOrientationListener.start();
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 关闭定位
         if(mLocationClient.isStarted()){
            mLocationClient.stop();
        }

        //停止方向传感器
        mOrientationListener.stop();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }


    @Override
    /**弹出menu菜单 */
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main ,menu);
        return true;
    }

    @Override
    /**判断点击了哪一个菜单项*/
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            //点击了普通地图
            case R.id.commonMap:
                //打开普通地图
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                break;

            //点击了卫星地图
            case R.id.siteMap:
                //打开卫星地图
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                break;

            //点击了交通图
            case R.id.trafficMap:
                // 判断交通图是否已经打开
                if(mBaiduMap.isTrafficEnabled()){
                    //如果交通图已经打开 点击就需要关闭交通图 并显示关闭交通图
                    mBaiduMap.setTrafficEnabled(false);
                    item.setTitle("实时交通图(off)");
                }else{
                    //如果交通图还没有打开 点击就需要打开交通图 并显示打开交通图
                    mBaiduMap.setTrafficEnabled(true);
                    item.setTitle("实时交通图(on)");
                }
                break;

            // 点击了我的位置
            case R.id.myLocation:
                // 定位到我的位置
                centerToMyLocation(mAddrStr);
                break;

            // 点击了普通模式
            case R.id.normalLocation:
                // 默认的定位模式为普通模式
                mLocationMode = MyLocationConfiguration.LocationMode.NORMAL;
                break;

            // 点击了跟随模式
            case R.id.followLocation:
                // 定位模式改为跟随模式
                mLocationMode = MyLocationConfiguration.LocationMode.FOLLOWING;
                break;

            // 点击了罗盘模式
            case R.id.compassLocation:
                // 定位模式改为罗盘模式
                mLocationMode = MyLocationConfiguration.LocationMode.COMPASS;
                break;

            case R.id.addOverLay:
                addOverLay(Info.infos);
                break;

            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 添加覆盖物
     * 这里的list理论上是从服务器上获取的  这里我们把它写死了
     */
    private void addOverLay(List infos) {
        // 清除一些无用图层
        mBaiduMap.clear();
        LatLng latLng = null;
        Marker marker = null;
        OverlayOptions options;
        for(Info info : infos){
            // 纬度  经度
            latLng = new LatLng(info.getLatitude(),info.getLongitude());
            // 图标
            options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);
            marker = (Marker) mBaiduMap.addOverlay(options);
            Bundle bundle = new Bundle();
            bundle.putSerializable("info" , info);
            marker.setExtraInfo(bundle);
        }

        // 每次添加完图层之后把地图移动到第一个图层的位置
        MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
        mBaiduMap.setMapStatus(msu);
    }

    private class MyLocationListener implements BDLocationListener{

        @Override
        // 定位成功的回调
        public void onReceiveLocation(BDLocation bdLocation) {
            //设置定位参数
            MyLocationData data = new MyLocationData.Builder()
                    // 定位半径
                    .accuracy(bdLocation.getRadius())
                    // 经度
                    .longitude(bdLocation.getLongitude())
                    // 纬度
                    .latitude(bdLocation.getLatitude())
                    // 更新方向得到当前位置
                    .direction(mCurrentX)
                    .build();

            mBaiduMap.setMyLocationData(data);
            // 随时更新经纬度
            mlongitude = bdLocation.getLongitude();
            mLatitude = bdLocation.getLatitude();
            // 随时知道自己位置的字符串
            mAddrStr = bdLocation.getAddrStr();
            // 设置自定义定位图标和定位模式  有正常模式 罗盘模式和跟随模式
            MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true , mIconLocation);
            mBaiduMap.setMyLocationConfiguration(config);

            // 判断是不是第一次定位
            if(isFirstIn){
                // 定位到我的位置
                centerToMyLocation(mAddrStr);
                // 第一次定位后就不是第一次定位了
                isFirstIn = false;
            }
        }
    }

    /**定位到我的位置*/
    private void centerToMyLocation(String addrStr) {
        // 设置坐标  纬度在前经度在后
        LatLng latLng = new LatLng(mLatitude ,mlongitude);
        MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
        mBaiduMap.animateMapStatus(msu);
        // 这里可以得到地址的条件是设置了option.setIsNeedAddress(true);
        Toast.makeText(mContext,  addrStr, Toast.LENGTH_SHORT).show();
    }
}

JavaBean代码:

//(Bean)info
import com.test.baidumap.R;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 模拟周围店铺信息的Bean
 * 实际项目中是从服务器中获取的json字符串 通过格式化为实体Bean
 */

public class Info implements Serializable{
    private static final long serialVersionUID = -1010101010101010101L;
    public static List infos = new ArrayList<>();

    public Info(double longitude, int thumb, double latitude, int imgId, String name, String distance) {
        this.longitude = longitude;
        this.thumb = thumb;
        this.latitude = latitude;
        this.imgId = imgId;
        this.name = name;
        this.distance = distance;
    }

    // 实际项目中是从服务器中获取的数据
    static{
        infos.add(new Info(120.282432, 1456 ,30.184232, R.mipmap.pic1, "麦当劳",
                "距离209米"));
        infos.add(new Info(120.184212, 1223 ,29.992435, R.mipmap.pic2, "肯德基",
                "距离897米"));
        infos.add(new Info(120.405632, 1111 ,30.172544, R.mipmap.pic3, "必胜客",
                "距离249米"));
        infos.add(new Info(120.004545, 1000 ,30.101452, R.mipmap.pic4, "德克士",
                "距离679米"));
    }
    // 经纬度
    private double longitude;
    private double latitude;
    // 图片
    private int imgId;
    // 商家名称
    private String name;
    // 距离
    private String distance;
    // 点赞数量
    private int thumb;

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public int getImgId() {
        return imgId;
    }

    public void setImgId(int imgId) {
        this.imgId = imgId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDistance() {
        return distance;
    }

    public void setDistance(String distance) {
        this.distance = distance;
    }

    public int getThumb() {
        return thumb;
    }

    public void setThumb(int thumb) {
        this.thumb = thumb;
    }
}

Listener代码:

//(listener)MyOrientationListener
/**
 * 方向传感监听器
 */
public class MyOrientationListener implements SensorEventListener{
    private SensorManager mSensorManager;
    private Context mContext;
    private Sensor mSensor;
    private float lastX;
    private OnOrientationListener mOnOrientationListener;


    public MyOrientationListener(Context context) {
        this.mContext = context;
    }

    public void setSensorManager(SensorManager mSensorManager){
        this.mSensorManager = mSensorManager;
    }

    public void setOnOrientationListener(OnOrientationListener mOnOrientationListener){
        this.mOnOrientationListener = mOnOrientationListener;
    }

    /**
     * 开始监听
     */
    public void start(){
        // 拿到传感器
        mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
        // 如果手机支持SensorManager
        if(mSensorManager !=null){
            // 拿到方向传感器
            mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        }

        // 如果手机支持Sensor
        if(mSensor !=null){
            // 设置传感器精度  如果游戏级别的经度可以设置为SENSOR_DELAY_
            mSensorManager.registerListener(this , mSensor ,SensorManager.SENSOR_DELAY_UI);
        }
    }

    /**
     * 结束监听
     */
    public void stop(){
        //移除监听
        mSensorManager.unregisterListener(this);
    }

    @Override
    /** 方向的改变 */
    public void onSensorChanged(SensorEvent sensorEvent) {
        // 如果事件返回的类型是方向传感器
        if(sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION){
            // 实时获取的x方向的值
            float x = sensorEvent.values[SensorManager.DATA_X];
            if(Math.abs(x - lastX) > 1.0){
                if(mOnOrientationListener != null){
                    mOnOrientationListener.onOrientationChanged(x);
                }
            }
            lastX = x;
        }
    }

    @Override
    /** 精度的改变 */
    public void onAccuracyChanged(Sensor sensor, int i) {

    }

    /** 方向改变的监听*/
    public interface OnOrientationListener{
        void onOrientationChanged(float x);
    }
}

注:

  本Demo用的百度的Key为私人的,如果要正常运行,得自己去百度地图API控制台申请Key,来替换Mainfest中的key
  如果定位自己的位置在海上的,注意查找代码的权限是否添加完整以及手机是否打开了本软件读取位置信息的权限
  

Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9842418


如需了解百度地图的基本环境配置请移步:Android中第三方SDK集成之百度地图集成(入门篇) http://blog.csdn.net/zxc514257857/article/details/69768308


———-因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-

你可能感兴趣的:(【Android第三方库使用】)