Android定位&地图&导航——基于百度地图移动获取位置和自动定位

一、问题描述

使用百度地图实现如图所示应用,首先自动定位当前我起始位置(小圆点位置),并跟随移动不断自动定位我的当前位置

百度Api不同版本使用会有些差异,本例中加入lib如下:

二、编写MyApplication类
public class MyApplication extends Application {
    static MyApplication myApplication;
    BMapManager mBMapManager = null;
    String mStrKey = "7ZfuRcOx1G3oZ8TKuTNGm4sO";
    boolean m_bKeyRight = true; // 授权Key正确,验证通过
    private List<Activity> activityList = new LinkedList<Activity>();
    @Override
    public void onCreate() {
        myApplication = this;
        initEngineManager(this);
        super.onCreate();
    }
    public void initEngineManager(Context context) {
        if (mBMapManager == null) {
            mBMapManager = new BMapManager(context);
            Toast.makeText(MyApplication.getInstance().getApplicationContext(),
                    "BMapManager  初始化SUCSUC!", Toast.LENGTH_LONG).show();
        }
        if (!mBMapManager.init(mStrKey, new MyGeneralListener())) {
            Toast.makeText(MyApplication.getInstance().getApplicationContext(),
                    "BMapManager  初始化错误!", Toast.LENGTH_LONG).show();
        }
    }

    public static MyApplication getInstance() {
        if (myApplication == null) {
            myApplication = new MyApplication();
        }
        return myApplication;
    }
    public void addActivity(Activity activity) {
        activityList.add(activity);
    }
    public void exit() {
        for (Activity activity : activityList) {
            activity.finish();
        }
        System.exit(0);
    }
    // 常用事件监听,用来处理通常的网络错误,授权验证错误等
    static class MyGeneralListener implements MKGeneralListener {
        public void onGetNetworkState(int iError) {
            if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
                Toast.makeText(
                        MyApplication.getInstance().getApplicationContext(),
                        "您的网络出错啦!", Toast.LENGTH_LONG).show();
            } else if (iError == MKEvent.ERROR_NETWORK_DATA) {
                Toast.makeText(
                        MyApplication.getInstance().getApplicationContext(),
                        "输入正确的检索条件!", Toast.LENGTH_LONG).show();
            }
            // ...
        }
        public void onGetPermissionState(int iError) {
            if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
                // 授权Key错误:
                Toast.makeText(
                        MyApplication.getInstance().getApplicationContext(),
                        "请输入正确的授权Key!",
                        Toast.LENGTH_LONG).show();
                MyApplication.getInstance().m_bKeyRight = false;
            }
        }

    }
}
三、编写主程序MainActivity,显示当前所处位置

主程序MainActity:

public class MainActivity extends Activity {
    public MyApplication app;
    static MapView mMapView = null;
    public MKMapViewListener mMapListener = null;
    MyLocationOverlay myLocationOverlay = null;
    // 定位相关
    LocationClient mLocClient;
    public NotifyLister mNotifyer = null;
    public MyLocationListenner myListener = new MyLocationListenner();
    LocationData locData = null;
    private MapController mMapController = null;

    static MKSearch mkSerach;

    Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Toast.makeText(MainActivity.this, "msg:" + msg.what,
                    Toast.LENGTH_SHORT).show();
        };
    };
    static TextView showAddr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showAddr = (TextView) findViewById(R.id.showAddr);
        MyIcon mi = new MyIcon(this);
        //在屏幕中心点添加接我图标
        getWindow().addContentView(
                mi,
                new LayoutParams(LayoutParams.FILL_PARENT,
                        LayoutParams.FILL_PARENT));
        MyIcon2 m2 = new MyIcon2(this);
        getWindow().addContentView(
                m2,
                new LayoutParams(LayoutParams.FILL_PARENT,
                        LayoutParams.FILL_PARENT));

        mMapView = (MapView) findViewById(R.id.bmapsView);
        mMapController = mMapView.getController();
        initMapView();
        app = MyApplication.getInstance();
        mLocClient = new LocationClient(this);
        mLocClient.registerLocationListener(myListener);

        //搜索初始化
        mkSerach = new MKSearch();
        mkSerach.init(app.mBMapManager, new MKSearchListener() {

            @Override
            public void onGetWalkingRouteResult(MKWalkingRouteResult arg0,
                    int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetTransitRouteResult(MKTransitRouteResult arg0,
                    int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetPoiDetailSearchResult(int arg0, int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetDrivingRouteResult(MKDrivingRouteResult arg0,
                    int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGetAddrResult(MKAddrInfo info, int arg1) {
                showAddr.setText(info.strAddr);
            }
        });

        //设置地图相关
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType("bd09ll");
        option.setScanSpan(300000);
        mLocClient.setLocOption(option);
        mLocClient.start();
        mMapView.getController().setZoom(16);
        mMapView.getController().enableClick(true);
        mMapView.displayZoomControls(true);
        mMapListener = new MKMapViewListener() {

            public void onMapMoveFinish() {

            }

            public void onClickMapPoi(MapPoi mapPoiInfo) {
                // TODO Auto-generated method stub
                String title = "";
                if (mapPoiInfo != null) {
                    title = mapPoiInfo.strText;
                    Toast.makeText(MainActivity.this, title, Toast.LENGTH_SHORT)
                            .show();
                }
            }
        };
        mMapView.regMapViewListener(MyApplication.getInstance().mBMapManager,
                mMapListener);
        myLocationOverlay = new MyLocationOverlay(mMapView);
        locData = new LocationData();
        myLocationOverlay.setData(locData);
        mMapView.getOverlays().add(myLocationOverlay);
        myLocationOverlay.enableCompass();
        mMapView.refresh();
    }

    private void initMapView() {
        mMapView.setLongClickable(true);
    }

    /**
     * 监听函数,又新位置的时候,格式化成字符串,输出到屏幕中
     */
    public class MyLocationListenner implements BDLocationListener {
        public void onReceiveLocation(BDLocation location) {
            if (location == null)
                return;
            locData.latitude = location.getLatitude();
            locData.longitude = location.getLongitude();
            locData.direction = 2.0f;
            locData.accuracy = location.getRadius();
            locData.direction = location.getDerect();
            Log.d("loctest",
                    String.format("before: lat: %f lon: %f",
                            location.getLatitude(), location.getLongitude()));
            myLocationOverlay.setData(locData);
            mMapView.refresh();
            mMapController
                    .animateTo(new GeoPoint((int) (locData.latitude * 1e6),
                            (int) (locData.longitude * 1e6)), mHandler
                            .obtainMessage(1));
        }
        public void onReceivePoi(BDLocation poiLocation) {
            if (poiLocation == null) {
                return;
            }
        }
    }
    public class NotifyLister extends BDNotifyListener {
        public void onNotify(BDLocation mlocation, float distance) {
        }
    }

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

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

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mMapView.onRestoreInstanceState(savedInstanceState);
    }
    public static void getPosition(GeoPoint g) {
        mkSerach.reverseGeocode(g);
        showAddr.setText("获取位置中...");
    }

}

Xml布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"

     >
    <TextView
        android:id="@+id/showAddr"
          android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="选择地点"
        android:textSize="20dp"
        />
 <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapsView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
</LinearLayout>
三、绘制图形

MyIcon 的onDraw实现绘制中心点的图标,MyIcon2绘制指示器图标,如图所示

public class MyIcon extends View {
    public static int w;
    public static int h;
    public static  Bitmap mBitmap;

    public MyIcon(Context context) {
        super(context);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.me);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        w = this.getWidth() / 2 - mBitmap.getWidth() / 2;
        h = this.getHeight() / 2 - mBitmap.getHeight() / 2;
        canvas.drawBitmap(mBitmap, w, h, null);
    }

}
public class MyIcon2 extends View{
    public static int w;
    public static int h;
    private Bitmap mBitmap;

    public MyIcon2(Context context) {
        super(context);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jiewo);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        w = this.getWidth() / 2 - mBitmap.getWidth() / 2;
        h = (this.getHeight() / 2 - mBitmap.getHeight() / 2) - (    MyIcon.mBitmap.getHeight()/2);
        canvas.drawBitmap(mBitmap, w, h, null);
    }
}

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:

时间: 2024-12-22 15:03:03

Android定位&地图&导航——基于百度地图移动获取位置和自动定位的相关文章

Android定位&amp;地图&amp;导航——基于百度地图实现的定位功能

一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册密钥:地址http://developer.baidu.com/map/ 2.下载定位SDK,并导入SDK如图所示: 三.编写MyApplication类 编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中 封装下列方法 1.  获取定位信息——

android 基于百度地图api开发定位以及获取详细地址

一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView .设计代码如下: Xml代码   <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&q

开源基于百度地图SDK的Android交通助手App

BaiduMap-TrafficAssistant ?? 该项目是基于百度地图SDK开发的一款交通助手App,目前已经上线豌豆荚.魅族应用市场.搜狗手机助手等多个安卓应用市场.目前我决定开源该项目,为更多的安卓应用开发者或者基于百度地图SDK开发人员提供服务和便利.当然App中还有不少bug和可扩展的功能模块,也希望各位开发者为该项目贡献自己的code力量.项目地址:https://github.com/chenyufeng1991/BaiduMap-TrafficAssistant 1.项目简

基于百度地图开发网易班车地图导航展示

来到网易已经不知不觉一两个月了,最近把原来租的房子出租后,打算重新租一套房子.找到一个好房子不容易,首先考虑交通问题,上下班时间不能耗费太长,网易提供了遍布全城的班车系统,不过说实话,貌似只有文字说明(http://crystalpot.cn/menus/bus),看到这些地名,对于我一个外乡人来说内心是懵X的,想到如果有一个如高德地图版的班车导航就好了,在哪个小区租房,附近的班车信息一目了然,想到便去做,翻了翻百度地图官方文档,写了几行代码,大致实现了需求. 预览 如图所示,只有寥寥几个站点,

Android学习笔记之使用百度地图实现Poi搜索

PS:装个系统装了一天.心里憔悴.感觉不会再爱了. 学习内容: 1.使用百度Map实现Poi搜索. 2.短串分享 3.在线建议查询   百度地图的研究也算是过半了.能够实现定位,实现相关信息的搜索,实现地图控制这也就算是掌握了一大部分了.这次主要是说说如何去实现poi搜索.那么什么是Poi.   Poi:poi中文翻译为兴趣点.捞干的说其实就是周边的一些ktv,酒店,餐馆,理发店等等都是一个poi.在实现了基础定位的前提后,去搜索附近的poi.这样就可以完成一些其他事情.比如说订一份外卖,预定一

基于百度地图的产品销售的单位查看功能设计与实现

基于百度地图实现产品销售的单位位置查看功能设计与实现 1.描述 本人最近参与基于MVC5+EF6+ Bootstrap3的食品安全监管系统设计.开发.先前感觉百度地图很神秘的样子.高大上的样子,设计.开发过程遇到些问题,经查看园子高手指点.示例摸索实践,终将百度地图嵌入系统.为感谢各位朋友的帮助,今有空,将基于百度地图实现产品销售的单位位置查看功能,分享给大家.不当之处,欢迎指正. 2.产品生产批次查询 查看单位产品生产批次信息,根据产品生产批次查看,产品销售单位情况. 效果图如下: 3.产品销

iOS百度地图poi检索(基于百度地图2.3.0SDK开发)

正好做到百度地图的poi检索,拿来分享一下,基于百度地图2.3.0SDK开发,说实话,这个新版本poi真不好用 先来看头文件里面,定义poi对象,当然你也可以写到实现文件里面 #import <UIKit/UIKit.h> #import "BMapKit.h" @interface NearByPlaceViewController : ViewControllerBase <BMKPoiSearchDelegate> {     BMKPoiSearch *

Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误

Android Studio 项目中集成百度地图SDK报以下错误: 1 java.lang.UnsatisfiedLinkError: Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create)I 2 at com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create(Native Met

基于百度地图程序eclipse导出APK密匙key出错

       最近基于百度地图sdk写了个demo,在eclipse上真机测试的时候是正常运行的,没有任何问题,但是当我导出apk安装到手机上的时候,却发现地图都是白格子,经调试发现程序并没有访问百度地图后台失败,发现原来是密匙key出错了       通过再三调试,原来在打包成apk的时候,eclipse的用来申请密匙的sha1变了       如图示,这是eclipse原来的sha1                                                   图一