使用百度地图AndroidSDK


一、功能:
1、将百度地图导入到app中
2、引入定位的功能,集合方向传感器实现方向定位
3、添加覆盖物、覆盖物点击的处理
4、模式的切换

二、开发前准备

(1)获取密钥
应用名称:任意填写
应用类型:AndroidSDK
数字签名(SHA1):
  在AndroidStudio   Terminal中输入  keytool -v -list -keystore C:\Users\Administrator\.android\debug.keystore  
debug.keystore放置的路径,一般都在这个路径,如果不在就找找。
包名:开发包包名
(2)进入百度地图SDK,相关下载,下载开发包

三、案例

 1.引入百度地图
(1)导入jar包和so库(在app中创建libs文件夹将 拷贝进去,再在app/main路径下创建一个jniLibs文件夹将所有的so文件导入)
(2)在manifest中的<application>里,添加

< meta-data
android :name= "com.baidu.lbsapi.API_KEY"
android :value= 开发者 key />
(3)添加用户权限
< uses-permission  android :name= "android.permission.GET_ACCOUNTS" />
< uses-permission  android :name= "android.permission.USE_CREDENTIALS" />
< uses-permission  android :name= "android.permission.MANAGE_ACCOUNTS" />
< uses-permission  android :name= "android.permission.AUTHENTICATE_ACCOUNTS" />
< uses-permission  android :name= "android.permission.ACCESS_NETWORK_STATE" />
< uses-permission  android :name= "android.permission.INTERNET" />
< uses-permission  android :name= "com.android.launcher.permission.READ_SETTINGS"/>
< uses-permission  android :name= "android.permission.CHANGE_WIFI_STATE" />
< uses-permission  android :name= "android.permission.ACCESS_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.BROADCAST_STICKY" />
< uses-permission  android :name= "android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
(4)在layout中,添加百度地图的mapView控件

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


(5)在MainActivity中,引入Context全局变量
public class MainActivity extends Activity {

	private MapView mMapView = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
		// 注意该方法要再setContentView方法之前实现
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.activity_main);
		mMapView = (MapView) findViewById(R.id.id_bmapView);
}
附:2017-7-5 复审, SDKInitializer.initialize(getApplicationContext()); 最好是在APP中注册一个Application对象用来做全局的初始化操作 

(6)让地图的声明周期跟当前Activity生命周期一致

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

(7)设置地图放大比例
mBaiduMap = mMapView.getMap();//从地图视图中获取百度地图实例对象
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);//设置对象为缩放等级15.0,标尺500米左右
mBaiduMap.setMapStatus(msu);//设置地图的比例尺


(8)在main.xml中,设置三个按钮:普通地图,卫星地图,是否开启实时交通
三个菜单控件分别对应如下的OnClickListener事件

mBaiduMap .setMapType(myBaiduMap .MAP_TYPE_NORMAL) ;//普通地图
mBaiduMap .setMapType(myBaiduMap .MAP_TYPE_SATELLITE) ;//卫星地图
mBaiduMap .setTrafficEnabled(false );    //实时交通关闭状态
mBaiduMap .setTrafficEnabled(false);   //实时交通开启状态


2.在上面的基础上,引入定位的功能

实现定位的功能,需要:
1、LocationClient
2、LocationClientOption进行定位的一些设置:是否开启GPS,当前的经纬度
3、BDLocationListener接口,通过1进行注册后,因为定位是个耗时的功能,当定位成功后,获得经纬度,再通过该接口进行回调,对主界面ui进行相应的操作

(1)声明地图客户端和监听器
(2)写类去实现,定位成功的回调
private class MyLocationListener implements BDLocationListener{

    @Override
    public void onReceiveLocation(BDLocation location) {
        }
}
(3)初始化必要配置
 
 
//locationClient的一些必要的配置

LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");//设置坐标类型
option.setIsNeedAddress(true);//返回当前的位置
option.setOpenGps(true);
option.setScanSpan(1000);//每隔1秒进行一次请求
mLocationClient.setLocOption(option);

 
 
wgs84 --GPS系统直接通过卫星定位获得的坐标.(最基础的坐标.)
这是百度锁用户的策略, bd09ll只能百度地图用, bd09可以其他地图用,所以不让用户把百度地图的数据转成其他地图的数据

gcj02 —天朝以安全原因为由,要求在中国使用的地图产品使用的都必须是加密后的坐标.这套加密后的坐标就是gcj02 google的中国地图.高德地图. 他们为中国市场的产品都是用这套坐标.
bd09ll 百度又在gcj02的技术上将坐标加密就成了 bd09ll坐标.
摩卡托坐标 是一种投影坐标,  它不是用经纬度来表示的.  它多用于航海图 航空图.

* 地图有分多个坐标系,bd09ll(百度经纬度坐标)、bd09mc(百度摩卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)
 
   
(4)在定位添加回调里写入
 
   
// 构造定位数据 
MyLocationData locData = new MyLocationData.Builder()
						.accuracy(location.getRadius())//设置经度(半径) // 
						.direction(mXDirection)// 此处设置开发者获取到的方向信息,顺时针0-360						
						.latitude(location.getLatitude())//设置纬度 
						.longitude(location.getLongitude())//设置经度 
						.build(); mBaiduMap.setMyLocationData(locData);//得到的数据转化给地图

// 第一次定位时,将地图位置移动到当前位置
if (isFirstIn)
{
    LatLng latLng = new LatLng(
            location.getLatitude(),//纬度
            location.getLongitude());//经度
    MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
    mBaiduMap.animateMapStatus(msu);

    isFirstIn = false;//当用户执行其他操作,类似下拉地图,不会又回到坐标点
}

(5)开启和关闭定位
(6)在Manifest中的<application>,注册百度定位时的服务

@Override
protected void onStart() {
    super.onStart();
    //开启定位
    mBaiduMap.setMyLocationEnabled(true);//默认开启定位允许
    if(!mLocationClient.isStarted())//如果没有启动,让他启动
        mLocationClient.start();
}

@Override
protected void onStop() {
    super.onStop();
    //停止定位
    mBaiduMap.setMyLocationEnabled(false);
    mLocationClient.stop();
}
(6)在Manifest中的<application>,注册百度定位时的服务


<service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote">

    <intent-filter>

        <action android:name = "com.baidu.location.service_v2.2">

        </action>

    </intent-filter>

</service>
大致完成百度地图定位了
(7)初始化
private Context context;
this.context this; // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
 
 
*通过toast获取地址的位置,反馈给用户
mLocationClient new LocationClient( this);
mLocationListener new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListener);//为当前的定位器注册监听事件
private LocationClient mLocationClient;//定位的客户端
private MyLocationListener mLocationListener;//定位的监听器
 
private boolean  isFirstIn true; //第一次登陆
(9)在main.xml中,添加按钮
 
 
<item
    android:id="@+id/id_map_location"
    android:showAsAction="never"
    android:title="我的位置"/>
(10)实现事件(抽取代码用cmd+alt+M)
 
 
private double mLatitude;
private double mLongitude;
case R.id.id_map_location:
    centerToMyLocation();
    break;
 
 
/*  *定位到我的位置  */ private void centerToMyLocation() {    LatLng latLng =  new LatLng(             mLatitude, //纬度              mLongitude); //经度     MapStatusUpdate msu = MapStatusUpdateFactory. newLatLng(latLng);     mBaiduMap.animateMapStatus(msu);}
3、例子三:集合方向传感器实现方向定位
1、自定义图标,需要:
BitmapDescriptor
(1)导入图标
(2)初始化
//自定义图标
private BitmapDescriptor mIconLocation;
/初始化图标
mIconLocation = BitmapDescriptorFactory. fromResource(R.drawable. navi_map_gps_locked);
(3)在回调函数中,增加
//设置自定义图标
MyLocationConfigeration config =  new MyLocationConfigeration(MyLocationConfigeration.LocationMode. NORMAL, true, mIconLocation); 
mBaiduMap.setMyLocationConfigeration(config);
2、引入方向传感器
(1)方向传感器类用来进行传感器的获取和传感器方向改变的监听
package  com.xl.maptest ;

import
  android.content.Context  ;
import
  android.hardware.Sensor  ;
import
  android.hardware.SensorEvent  ;
import
  android.hardware.SensorEventListener  ;
import
  android.hardware.SensorManager  ;
import
  android.widget.Toast  ;

/**
* Created by Administrator on 2/2/2016.
*/
public class  MyOrientationListener  implements  SensorEventListener {
   
  private  SensorManager  mSensorManager ;
    private
  Context  mContext ;
    private
  Sensor  mSensor ;
    private float
  lastX  ;


    public
  MyOrientationListener(Context context) {
       
  this  . mContext  = context  ;
   
  }
   
  public void  start ()
    {
       
  mSensorManager  = (SensorManager) mContext .getSystemService(Context.  SENSOR_SERVICE ) ;  //获得系统服务
       
  if  ( mSensorManager !=  null )
        {
            Toast.
makeText (
mContext  , "获取到方向传感器"  , Toast. LENGTH_LONG ).show()  ;
           
  //获得方向传感器
          
  mSensor  =  mSensorManager .getDefaultSensor(Sensor.  TYPE_ORIENTATION ) ;

       
  }
       
  if  ( mSensor !=  null )
        {
           
  mSensorManager  .registerListener( this, mSensor  , mSensorManager .  SENSOR_DELAY_UI ) ;  //设置传感器精度
       
  }

    }
    
  public void  stop ()
     {
        
  mSensorManager  .unregisterListener( this )  ;
    
  }

   
  @Override
   
  public void  onSensorChanged (SensorEvent event) {
       
  if  (event. sensor .getType()==Sensor.  TYPE_ORIENTATION )
        {
           
  float  x =event. values [SensorManager.  DATA_X ] ;
            if
(Math. abs(x-  lastX )> 1.0  )
            {
               
  if (  mOnOrientationListener  != null  )
                {
                   
  mOnOrientationListener .onOrientationChanged(x)  ;
               
  }
            }
           
  lastX  =x ;
       
  }
    }

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

   
  private  OnOrientationListener  mOnOrientationListener ;

   
  @Override
   
  public void  onAccuracyChanged (Sensor sensor , int  accuracy) {

    }
   
  public interface  OnOrientationListener{
       
  void  onOrientationChanged  ( float  x)  ;
   
  }
}

在主Activity中将传感器的生命周期与定位的生命周期保持一致。
//开启方向传感器
myOrientationListener  .start() ;
//停止方向传感器
myOrientationListener  .stop() ;
实现方向传感器类的回调
myOrientationListener  = new  MyOrientationListener(  context ) ;
myOrientationListener  .setOnOrientationListener(  new  MyOrientationListener.OnOrientationListener() {
   
  @Override
   
  public void  onOrientationChanged ( float  x) {
       
  mCurrentX  = x ;
   
  }
});

4、例子四:模式的切换
MyLocationConfiguration这个类提供了三个枚举类型的LocationMode
public static enum  LocationMode {
    NORMAL
,
   
  FOLLOWING  ,
    COMPASS ;
MyLocationConfiguration config =  new  MyLocationConfiguration( mLocationMode ,true,  mIconLocation ) ;
myBaiduMap  .setMyLocationConfigeration(config)  ;
它可以传输三个参数分别是 参数1:模式,参数2:是否启动定位 参数3:定位坐标图片
在main上添加三个item,个item点击事件分别如下
case  R.id. id_map_mode_common :
   
  mLocationMode  = MyLocationConfiguration.LocationMode.  NORMAL ;
    break;
case
  R.id.  id_map_mode_follow  :
   
  mLocationMode  = MyLocationConfiguration.LocationMode.  FOLLOWING ;
    break;
case
  R.id.  id_map_mode_compass  :
   
  mLocationMode  = MyLocationConfiguration.LocationMode.  COMPASS ;
    break;

5、例子五:添加覆盖物,覆盖物点击处理
Marker覆盖物
OverLayOptions 覆盖物添加在所在的图层上,可以设置图标和位置。

写一个Info类用来存储静态信息。
package  com.xl.maptest ;

import
  java.io.Serializable  ;
import
  java.util.ArrayList  ;
import
  java.util.List  ;

public class
  Info  implements  Serializable
{
   
  private static final long  serialVersionUID  = - 1010711775392052966L ;
    private double
  latitude  ;
    private double
  longitude  ;
    private int
  imgId  ;
    private
  String  name ;
    private
  String  distance ;
    private int
  zan  ;

    public static
  List<Info>  infos  =  new  ArrayList<Info>() ;

    static
   
  {
       
  infos .add(  new  Info( 34.242652  ,  108.971171 ,  R.drawable. a01 ,  "英伦贵族小旅馆"  ,
               
  "距离209米" ,  1456  )) ;
       
  infos .add(  new  Info( 34.242952  ,  108.972171 ,  R.drawable. a02 ,  "沙井国际洗浴会所"  ,
               
  "距离897米" ,  456  )) ;
       
  infos .add(  new  Info( 34.242852  ,  108.973171 ,  R.drawable. a03 ,  "五环服装城"  ,
               
  "距离249米" ,  1456  )) ;
       
  infos .add(  new  Info( 34.242152  ,  108.971971 ,  R.drawable. a04 ,  "老米家泡馍小炒"  ,
               
  "距离679米" ,  1456  )) ;
   
  }

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

   
  public double  getLatitude ()
    {
       
  return  latitude ;
   
  }

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

   
  public double  getLongitude ()
    {
       
  return  longitude ;
   
  }

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

   
  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  getZan ()
    {
       
  return  zan ;
   
  }

   
  public void  setZan ( int  zan)
    {
       
  this  . zan  = zan  ;
   
  }

}
在main中添加一个item:添加覆盖物
//覆盖物相关
private  BitmapDescriptor  mMarker  ;
private RelativeLayout mMarkerLy;

private void  initMarker () {
   
  mMarker  =BitmapDescriptorFactory.fromResource(R.mipmap. maker )  ;
   
  mMarkerLy  =(RelativeLayout)findViewById(R.id.  id_marker_layout ) ;
}
在addOverlays存放了info 对象
/**
* 添加覆盖物
*
 @param
  infos
*/
private void  addOverlays (List<Info> infos) {
   
  myBaiduMap  .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)  myBaiduMap .addOverlay(options) ;
       
  Bundle mBundle =  new  Bundle() ;
       
  mBundle.putSerializable(  "info" , info)  ;
       
  marker.setExtraInfo(mBundle)  ;
   
  }
    MapStatusUpdate msu =MapStatusUpdateFactory.
newLatLng (latLng)
;
   
  myBaiduMap  .setMapStatus(msu) ;

}
对百度地图设置覆盖物设置点击事件
         myBaiduMap.setOnMarkerClickListener( new BaiduMap.OnMarkerClickListener() {
             @Override
             public boolean  onMarkerClick(Marker marker) {
                Bundle ExtraInfo = marker.getExtraInfo() ;
                Info info = (Info) ExtraInfo.getSerializable( "info") ;
                ImageView iv = (ImageView)  mMarkerLy.findViewById(R.id. id_info_img) ;
                TextView distance = (TextView)  mMarkerLy.findViewById(R.id. id_info_distance) ;
                TextView dname = (TextView)  mMarkerLy.findViewById(R.id. id_info_name) ;
                TextView zan = (TextView)  mMarkerLy.findViewById(R.id. id_info_zan) ;
                iv.setImageResource(info.getImgId()) ;
                distance.setText(info.getDistance()) ;
                dname.setText(info.getName()) ;
                zan.setText(info.getZan() +  "") ;
               
                 mMarkerLy.setVisibility(View. VISIBLE) ;
                return true;
            }
        }) ;
         myBaiduMap.setOnMapClickListener( new BaiduMap.OnMapClickListener() {
             @Override
             public void  onMapClick(LatLng latLng) {
                 mMarkerLy.setVisibility(View. GONE) ;
            }
6、例子六:点击覆盖物显示文本

    InfoWindow infoWindow ;
               
  TextView tv = new  TextView( context )  ;
               
  tv.setBackgroundResource(R.drawable. location_tips )  ;
               
  tv.setPadding( 30  ,  20 ,  30 ,  50  ) ;
               
  tv.setText(info.getName()) ;
               
  tv.setTextColor(Color.parseColor ( "#ffffff"  )) ;

                final
  LatLng latLng = marker.getPosition() ;
//                Point p = myBaiduMap.getProjection().toScreenLocation(latLng);
//                p.y -= 47;
//                LatLng ll = myBaiduMap.getProjection().fromScreenLocation(p);
               
  infoWindow = new  InfoWindow(tv , latLng  , - 47  ) ;
               
  myBaiduMap .showInfoWindow(infoWindow)  ;
                mMarkerLy.setVisibility(View. VISIBLE);


InfoWindow 有两个构造
public InfoWindow(View var1, LatLng var2, int var3) {
        if(var1 != null && var2 != null) {
            this.b = var1;
            this.c = var2;
            this.e = var3;
        } else {
            throw new IllegalArgumentException("view and position can not be null");
        }
    }
这个第一个是控件View 第二个是坐标,第三个是偏移量

public InfoWindow(BitmapDescriptor var1, LatLng var2, int var3, InfoWindow.OnInfoWindowClickListener var4) {
        if(var1 != null && var2 != null) {
            this.a = var1;
            this.c = var2;
            this.d = var4;
            this.e = var3;
        } else {
            throw new IllegalArgumentException("bitmapDescriptor and position can not be null");
        }
特地把InfoWindow 四个参数bitmapDescriptor  Latlng  int  OnInfoWindowClickListener
在这里的话 第一个是图片 第二个坐标,第三个是窗口偏移量  第四个是为窗口添加单击监听...
myBaiduMap  .showInfoWindow(infoWindow)  ;
myBaiduMap .hideInfoWindow() ;
用来显示和隐藏InfoWindow

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值