使用百度地图结合GPS进行定位

1
回复
5589
查看
[复制链接]

5

主题

22

帖子

7

安币

初级码农

菜鸟

Rank: 1

发表于 2014-11-4 13:53:46 | 显示全部楼层 |阅读模式
package com.home;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class LocationActivity extends Activity {
        /** 定义LocationManager对象 */
        private LocationManager locationManager;
        /** 定义当前Location对象 */
        private Location currentLocation;
        /** 显示地图的View */
        private MapView mMapView = null;
        /**
         * 用MapController完成地图控制
         */
        private MapController mMapController = null;
        /**
         * MKMapViewListener 用于处理地图事件回调
         */
        MKMapViewListener mMapListener = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                /**
                 * 使用地图sdk前需先初始化BMapManager. BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
                 * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
                 */
                DemoApplication app = (DemoApplication) this.getApplication();
                if (app.mBMapManager == null) {
                        app.mBMapManager = new BMapManager(this);
                        /**
                         * 如果BMapManager没有初始化则初始化BMapManager
                         */
                        app.mBMapManager.init(DemoApplication.strKey,
                                        new DemoApplication.MyGeneralListener());
                }
                setContentView(R.layout.main);
                init();
        }

        /**
         * 初始化
         */
        private void init() {
                // 获取系统LocationManager服务
                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                // // 从GPS获取最近的定位信息
                currentLocation = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                // 绑定监听,有4个参数
                // 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
                // 参数2,位置信息更新周期,单位毫秒
                // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
                // 参数4,监听
                // 备注:对于参数2和3:若参数3不为0,则以参数3为准;若参数3为0,则通过时间来定时更新;两者为0,则随时刷新
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2,
                                1, new LocationListener() {

                                        @Override
                                        public void onLocationChanged(Location location) {
                                                updateMap(location);
                                        }

                                        @Override
                                        public void onProviderDisabled(String provider) {
                                                updateMap(null);
                                        }

                                        @Override
                                        public void onProviderEnabled(String provider) {
                                                updateMap(locationManager
                                                                .getLastKnownLocation(provider));

                                        }

                                        @Override
                                        public void onStatusChanged(String provider, int status,
                                                        Bundle extras) {
                                        }
                                });
                initMap();
        }

        /**
         * 初始化地图
         */
        private void initMap() {
                mMapView = (MapView) findViewById(R.id.main_bmapView);
                /**
                 * 获取地图控制器
                 */
                mMapController = mMapView.getController();
                /**
                 * 设置地图是否响应点击事件 .
                 */
                mMapController.enableClick(true);
                /**
                 * 设置地图缩放级别
                 */
                mMapController.setZoom(12);
                double cLat = 39.945;
                double cLon = 116.404;
                // 如果未能定位则设置默认中心点为天安门
                GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6));
                mMapController.setCenter(p);
                updateMap(currentLocation);
                mMapListener = new MKMapViewListener() {
                        @Override
                        public void onMapMoveFinish() {
                                /**
                                 * 在此处理地图移动完成回调 缩放,平移等操作完成后,此回调被触发
                                 */
                        }

                        @Override
                        public void onClickMapPoi(MapPoi mapPoiInfo) {
                                /**
                                 * 在此处理底图poi点击事件 显示底图poi名称并移动至该点 设置过:
                                 * mMapController.enableClick(true); 时,此回调才能被触发
                                 *
                                 */
                                String title = "";
                                if (mapPoiInfo != null) {
                                        title = mapPoiInfo.strText;
                                        Toast.makeText(LocationActivity.this, title,
                                                        Toast.LENGTH_SHORT).show();
                                        mMapController.animateTo(mapPoiInfo.geoPt);
                                }
                        }

                        @Override
                        public void onGetCurrentMap(Bitmap b) {
                                /**
                                 * 当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备
                                 */
                        }

                        @Override
                        public void onMapAnimationFinish() {
                                /**
                                 * 地图完成带动画的操作(如: animationTo())后,此回调被触发
                                 */
                        }

                        /**
                         * 在此处理地图加载完成事件
                         */
                        @Override
                        public void onMapLoadFinish() {
                                Toast.makeText(LocationActivity.this, "地图加载完成",
                                                Toast.LENGTH_SHORT).show();

                        }
                };
                mMapView.regMapViewListener(DemoApplication.getInstance().mBMapManager,
                                mMapListener);
        }

        @Override
        protected void onPause() {
                /**
                 * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
                 */
                mMapView.onPause();
                super.onPause();
        }

        @Override
        protected void onResume() {
                /**
                 * MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
                 */
                mMapView.onResume();
                super.onResume();
        }

        @Override
        protected void onDestroy() {
                /**
                 * MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
                 */
                mMapView.destroy();
                super.onDestroy();
        }

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

        }

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
                super.onRestoreInstanceState(savedInstanceState);
                mMapView.onRestoreInstanceState(savedInstanceState);
        }

        /**
         * 更新地图
         */
        private void updateMap(Location location) {
                if (location != null) {
                        // 纬度
                        double latitude = location.getLatitude();
                        // 经度
                        double longitude = location.getLongitude();
                        GeoPoint p = new GeoPoint((int) (latitude * 1E6),
                                        (int) (longitude * 1E6));
                        mMapController.setCenter(p);
                }
        }
}


菜鸟

5

主题

22

帖子

7

安币

初级码农

菜鸟

Rank: 1

 楼主| 发表于 2014-11-4 13:54:05 | 显示全部楼层
Manifest里面比上文多加一个如下权限:
<span style="font-size:18px"> <!-- 使用GPS需要的权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></span>
菜鸟
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )