总结:

第一次使用百度地图SDK进行地图的开发,遇到了很多的问题,在此做一下记录。

  • 按照百度地图官网的步骤注册并获取开发密钥AK
  • 在AndroidStudio导入应用所需的jar包和so包
  • 注意定位功能的实现时如果需要显示addr的信息,那么需要设置 option.setIsNeedAddress( true );
  • 在真机上测试时要注意打开手机上的定位权限
    在定位测试过程中如果出错,可以根据相应的error code来排错, 以下是常用的error code:
61 : GPS定位结果,GPS定位成功。
62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者wifi网络是否正常开启,尝试重新请求定位。
63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。
67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。
68 : 网络连接失败时,查找本地离线定位时对应的返回结果。
161: 网络定位结果,网络定位定位成功。
162: 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。
167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。
502: key参数错误,请按照说明文档重新申请KEY。
505: key不存在或者非法,请按照说明文档重新申请KEY。
601: key服务被开发者自己禁用,请按照说明文档重新申请KEY。
602: key mcode不匹配,您的ak配置过程中安全码设置有问题,请确保:sha1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请KEY。
501~700:key验证失败,请按照说明文档重新申请KEY。

1.布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_change"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="切换" />

        <Button
            android:id="@+id/btn_traffic"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="打开" />

        <Button
            android:id="@+id/btn_opt"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="标注" />

        <Button
            android:id="@+id/btn_loc"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="定位" />
    </LinearLayout>

    <TextView
        android:id="@+id/locmsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

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

2.MainActivity.java:

public class MainActivity extends Activity {
    private MapView mMapView = null;
    private BaiduMap mBaiduMap;
    private Button btn_change;
    private Button btn_btn_traffic;
    private Button btn_opt;
    private Button btn_loc;
    private TextView mTextView = null;
    private boolean isFirstLoc = true;  //是否首次定位
    private LocationClient mLocationClient = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        //地图对象
        mBaiduMap = mMapView.getMap();

        //定位初始化
        mLocationClient = new LocationClient(getApplicationContext());
        //通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        option.setIsNeedAddress( true );
        option.setWifiCacheTimeOut( 5*60*1000 );
        option.setLocationMode( LocationClientOption.LocationMode.Hight_Accuracy );

        //设置locationClientOption
        mLocationClient.setLocOption(option);

        //注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);


        initView();

        //按钮的监听器
        btn_change.setOnClickListener( clickListener );
        btn_btn_traffic.setOnClickListener( clickListener );
        btn_opt.setOnClickListener( clickListener );
        btn_loc.setOnClickListener( clickListener );
    }

    private void initView() {
        btn_change = findViewById( R.id.btn_change );
        btn_btn_traffic = findViewById( R.id.btn_traffic );
        btn_opt = findViewById( R.id.btn_opt );
        btn_loc = findViewById( R.id.btn_loc );
        mTextView = findViewById( R.id.locmsg );
    }

    public View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(v.getId() == R.id.btn_change){
                if(mBaiduMap.getMapType() == BaiduMap.MAP_TYPE_NORMAL)
                    mBaiduMap.setMapType( BaiduMap.MAP_TYPE_SATELLITE );
                else
                    mBaiduMap.setMapType( BaiduMap.MAP_TYPE_NORMAL );
            }else if(v.getId() == R.id.btn_traffic){
                if(!mBaiduMap.isTrafficEnabled())
                    mBaiduMap.setTrafficEnabled( true );
                else
                    mBaiduMap.setTrafficEnabled( false );
            }else if(v.getId() == R.id.btn_opt){
                addOpt();
            }
            else if(v.getId() == R.id.btn_loc){
                //开启地图定位图层
                mLocationClient.start();
                mTextView.setVisibility( View.VISIBLE );
            }
        }
    };

    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null){
                return;
            }

            mBaiduMap.setMyLocationEnabled(true);

            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            //判断是否是第一次定位
            if(isFirstLoc){
                isFirstLoc = false;
                //将地图移动到定位的位置
                float f = mBaiduMap.getMaxZoomLevel();
                LatLng ll = new LatLng( location.getLatitude(),location.getLongitude() );
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom( ll,f-2 );
                mBaiduMap.animateMapStatus( u );
            }
            StringBuffer sb = new StringBuffer(256);
            sb.append( "time:" );
            sb.append(location.getTime());
            sb.append("\nerror code : ");
            sb.append(location.getLocType());
            sb.append("\nlatitude : ");
            sb.append(location.getLatitude());
            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());
            sb.append("\nradius : ");
            sb.append(location.getRadius());
            if (location.getLocType() == BDLocation.TypeGpsLocation){
                //GPS定位
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());
                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());
                sb.append( "\nheight:" );
                sb.append( location.getAltitude() );
                sb.append( "\ndirection:" );
                sb.append( location.getDirection() );
                sb.append( "\naddr:" );
                sb.append( location.getAddrStr() );
                sb.append( "\ndescribe:" );
                sb.append( "GPS定位成功!" );
            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
                sb.append( "\noperationer:" );
                sb.append( location.getOperators() );
                sb.append( "\ndescribe:" );
                sb.append( "网络定位成功" );
            }else if(location.getLocType() == BDLocation.TypeOffLineLocation){
                //离线定位
                sb.append( "\ndescribe:" );
                sb.append( "离线定位成功" );
            }else if(location.getLocType() == BDLocation.TypeServerError){
                sb.append( "\ndescribe:" );
                sb.append( "server定位失败,没有对应的位置信息" );
            }else if(location.getLocType() == BDLocation.TypeNetWorkException){
                sb.append( "\ndescribe:" );
                sb.append( "网络连接失败" );
            }
            mTextView.setText( sb );
        }
    }


    private void addOpt() {
        LatLng point = new LatLng( 39.9155260000,116.4038470000 );
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource( R.drawable.tag );
        OverlayOptions option = new MarkerOptions().position( point ).icon( bitmap );
        mBaiduMap.addOverlay( option );
    }

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

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

    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }
}

3.DemoApplication.java

public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType( CoordType.BD09LL);
    }
}

4.定位需要的权限:

<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />