地图应用开发(android)使用百度地图sdk详解+案例附源码

原创
2016/06/15 17:26
阅读数 9.3K

一、申请密钥

百度地图api 的key:http://lbsyun.baidu.com/apiconsole/key

----------输入sh1和包名即可生成key。

注意:关于安全码 ( 数字签名;包名 ) 的获取

1、eclipse下获取(这个最简单了):

2、androidstudio下获取:

    在Android Studio中的Terminal中使用keytool获取了,具体如下图所示:

提示:输入密钥库口令--测试的默认口令为:android;

            如果使用自己提供的keystore,就是自己的密码了;

接下来新建的百度应用就不不说了!!!!、

二、接下来切入正题:

 

第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

        在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下;

    官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加,或者直接把官网包libs所有的包都拷贝过来,拷贝完成后的工程目录如下图所示:

注:liblocSDK6a.so和locSDK_6.13.jar为百度定位SDK所使用资源,开发者可根据实际需求自行添加。

百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:

第二步:在AndroidManifest中添加开发密钥、所需权限等信息;

1)在application中添加开发密钥

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  
</application>

2)添加所需权限

<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.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" />

第三步,在布局xml文件中添加地图控件;

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

第四步:MainAcvitivity.java代码:

package com.example.baidumap;

import java.lang.reflect.Method;

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.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.baidumap.MyOrientationListener.OnOrientationListener;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;

/**
 * 
 * MapView的基本用法
 * 
 * @author yaowen.wang
 */

public class MainActivity extends Activity {

    MapView mMapView = null;// 地图控件
    BaiduMap mBaiduMap;// 地图实例
    LocationClient mLocationClient;// 定位的客户端
    MyLocationListener mMyLocationListener;// 定位的监听器
    LocationMode mCurrentMode = LocationMode.NORMAL;// 当前定位的模式
    private volatile boolean isFristLocation = true;// 是否是第一次定位
    // 最新一次的经纬度
    private double mCurrentLantitude;
    private double mCurrentLongitude;
    // 当前的精度
    private float mCurrentAccracy;
    // 方向传感器的监听器
    private MyOrientationListener myOrientationListener;
    private int mXDirection;// 方向传感器X方向的值
    // 地图定位的模式
    private String[] mStyles = new String[] { "地图模式--正常", "地图模式--跟随", "地图模式--罗盘" };
    private int mCurrentStyle = 0;

    @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);
        // 第一次定位
        isFristLocation = true;
        // 获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        // 获得地图的实例
        mBaiduMap = mMapView.getMap();
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        mBaiduMap.setMapStatus(msu);
        // 初始化定位
        initMyLocation();
        // 初始化传感器
        initOritationListener();

    }

    /**
     * 初始化方向传感器
     */
    private void initOritationListener() {
        // TODO Auto-generated method stub
        myOrientationListener = new MyOrientationListener(getApplicationContext());
        myOrientationListener.setOnOrientationListener(new OnOrientationListener() {
            @Override
            public void onOrientationChanged(float x) {
                mXDirection = (int) x;

                // 构造定位数据
                MyLocationData locData = new MyLocationData.Builder().accuracy(mCurrentAccracy)
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(mXDirection).latitude(mCurrentLantitude).longitude(mCurrentLongitude).build();
                // 设置定位数据
                mBaiduMap.setMyLocationData(locData);
                // 设置自定义图标
                BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
                MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
                mBaiduMap.setMyLocationConfigeration(config);

            }
        });
    }

    /**
     * 初始化定位相关控件
     */
    private void initMyLocation() {
        // TODO Auto-generated method stub
        // 定位初始化
        mLocationClient = new LocationClient(this);
        mMyLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(mMyLocationListener);
        // 设置定位的相关配置
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);// 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        mLocationClient.setLocOption(option);
    }

    /**
     * 实现实位回调监听
     */
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation arg0) {
            // TODO Auto-generated method stub
            // map view 销毁后不在处理新接收的位置
            if (arg0 == null || mMapView == null)
                return;
            // 构造定位数据
            MyLocationData locData = new MyLocationData.Builder().accuracy(arg0.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(mXDirection).latitude(arg0.getLatitude()).longitude(arg0.getLongitude()).build();
            mCurrentAccracy = arg0.getRadius();
            // 设置定位数据
            mBaiduMap.setMyLocationData(locData);
            mCurrentLantitude = arg0.getLatitude();
            mCurrentLongitude = arg0.getLongitude();
            // 设置自定义图标
            BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
            MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
            mBaiduMap.setMyLocationConfigeration(config);
            // 第一次定位时,将地图位置移动到当前位置
            if (isFristLocation) {
                isFristLocation = false;
                LatLng ll = new LatLng(arg0.getLatitude(), arg0.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(u);
            }
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * 默认点击menu菜单,菜单项不现实图标,反射强制其显示
     */
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {

        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                }
            }

        }
        return super.onMenuOpened(featureId, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case R.id.id_menu_map_common:
            // 普通地图
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
            break;
        case R.id.id_menu_map_site:// 卫星地图
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
            break;
        case R.id.id_menu_map_traffic:
            // 开启交通图

            if (mBaiduMap.isTrafficEnabled()) {
                item.setTitle("开启实时交通");
                mBaiduMap.setTrafficEnabled(false);
            } else {
                item.setTitle("关闭实时交通");
                mBaiduMap.setTrafficEnabled(true);
            }
            break;
        case R.id.id_menu_map_myLoc:
            center2myLoc();
            break;
        case R.id.id_menu_map_style:
            mCurrentStyle = (++mCurrentStyle) % mStyles.length;
            item.setTitle(mStyles[mCurrentStyle]);
            // 设置自定义图标
            switch (mCurrentStyle) {
            case 0:
                mCurrentMode = LocationMode.NORMAL;
                break;
            case 1:
                mCurrentMode = LocationMode.FOLLOWING;
                break;
            case 2:
                mCurrentMode = LocationMode.COMPASS;
                break;
            }
            BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
            MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
            mBaiduMap.setMyLocationConfigeration(config);
            break;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * 地图移动到我的位置,此处可以重新发定位请求,然后定位; 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好
     */
    private void center2myLoc() {
        LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);
        MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
        mBaiduMap.animateMapStatus(u);
    }

    @Override
    protected void onStart() {
        // 开启图层定位
        mBaiduMap.setMyLocationEnabled(true);
        if (!mLocationClient.isStarted()) {
            mLocationClient.start();
        }
        // 开启方向传感器
        myOrientationListener.start();
        super.onStart();
    }

    @Override
    protected void onStop() {
        // 关闭图层定位
        mBaiduMap.setMyLocationEnabled(false);
        mLocationClient.stop();

        // 关闭方向传感器
        myOrientationListener.stop();
        super.onStop();
    }

    @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();
    }

}
 

第四步:运行及截图:

 

-----温馨提示:可以查看官方api说明文档!

 

源码地址链接:

                            https://github.com/yaowen613/BaiduMap

展开阅读全文
打赏
0
50 收藏
分享
加载中
更多评论
打赏
0 评论
50 收藏
0
分享
在线直播报名
返回顶部
顶部