开发百度地图之实现

 在地图上标记用户当前所处位置其实是一个GPS定位应用。首先通过GPS定位获取到用户当前所在位置的经纬度,再将该经纬度所代表的点在地图上标出来。其实除了在地图上标注自己所处的位置外,我们通常还有这样的需求:“如果我的位置发生改变,要能够实时在地图上体现出来”。

新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView 。设计代码如下:

Xml代码  [url=]  [/url]

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

             android:layout_width="fill_parent" 

             android:layout_height="fill_parent" 

             android:orientation="vertical" > 

    <FrameLayout 

        android:id="@+id/map_layout" 

        android:layout_width="fill_parent"

       android:layout_height="fill_parent"

       android:orientation="vertical" >

     <!-- 百度MapView控件 -->  

       <com.baidu.mapapi.MapView  

                android:id="@+id/map_view"  

                android:layout_width="fill_parent"  

                android:layout_height="fill_parent"

                android:apiKey="0Mg_koWoyZUiYLfZxmPfp4LKInB5LqTnagYueaw"  

               android:clickable="true"  

               android:enabled="true" />

        <LinearLayout  

                android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:layout_gravity="center"

               android:orientation="vertical"  

              android:paddingBottom="105dip" >

           <!-- 地址信息显示TextView -->  

            <TextView  

                     android:id="@+id/map_bubbleText"  

                     android:layout_width="wrap_content"

                     android:layout_height="wrap_content"

                    android:background="@drawable/location_tips"  

                    android:gravity="left|center"

                    android:maxEms="12"  

                    android:paddingLeft="12dip"

                    android:paddingRight="10dip"

                    android:text="@string/load_tips"

                    android:textColor="#cfcfcf"

                   android:textSize="14sp" />

      </LinearLayout>

       <LinearLayout

                    android:layout_width="wrap_content"  

                    android:layout_height="wrap_content"  

                    android:layout_gravity="center"

                    android:orientation="vertical" >  

            <!-- 位置指标显示ImageView -->  

         <ImageView  

                       android:id="@+id/point_image"  

                       android:layout_width="wrap_content"        

                      android:layout_height="wrap_content"

                      android:layout_gravity="center"  

                     android:layout_marginBottom="30dip"  

                    android:src="@drawable/point_start" />

         </LinearLayout>

 </FrameLayout>  

</LinearLayout> 

三:创建覆盖整个地图捕捉触控事件的MyMapOverlay继承Overlay

Java代码  [url=] [/url]

import android.view.MotionEvent;  

import com.baidu.mapapi.GeoPoint;

import com.baidu.mapapi.MapView;  

import com.baidu.mapapi.Overlay;

//覆盖整个地图捕捉触控事件的OverLay  

        public abstract class MyMapOverlay extends Overlay{  

                          private int point_X;  

                          private int point_Y;  

                          private GeoPoint newPoint;  

        public MyMapOverlay(int x,int y){  

                         point_X = x;  

                        point_Y = y;  

         }  

         boolean flagMove=false;

        //这里实现根据地图移动时重新获取屏幕中心点的经纬度坐标

         @Override  

   public boolean onTouchEvent(MotionEvent event, MapView mapView) {

                   System.out.println("X->"+event.getX()+":"+point_X);  

                   System.out.println("Y->"+event.getY()+":"+point_Y);

      if(event.getAction() == MotionEvent.ACTION_DOWN){

                  changePoint(newPoint,1);  

      }else if(event.getAction() == MotionEvent.ACTION_UP){

                 newPoint = mapView.getProjection().fromPixels(point_X,point_Y);  

                  changePoint(newPoint,2);  

       }        

                  return false;

      }  

      public abstract void changePoint(GeoPoint newPoint,int type); 

四:LocationActivity类继承百度库的MapActivity以及实现LocationListener接口,代码如下:  

package com.location.activity;Java代码  [url=]  [/url]

import java.io.IOException;

import java.util.List;import java.util.Locale;

import android.content.Intent;  

import android.location.Address;

import android.location.Geocoder;  

import android.location.Location;  

import android.os.Bundle;  

import android.os.Handler;  

import android.os.Message;  

import android.view.View;  

import android.view.Window;  

import android.widget.TextView;  

import com.android.map.MyMapOverlay;

import com.baidu.mapapi.BMapManager;  

import com.baidu.mapapi.GeoPoint;

import com.baidu.mapapi.LocationListener;  

import com.baidu.mapapi.MKAddrInfo;  

import com.baidu.mapapi.MKBusLineResult;  

import com.baidu.mapapi.MKDrivingRouteResult;

import com.baidu.mapapi.MKLocationManager;  

import com.baidu.mapapi.MKPoiResult;  

import com.baidu.mapapi.MKSearch;

import com.baidu.mapapi.MKSearchListener;

import com.baidu.mapapi.MKSuggestionResult;

import com.baidu.mapapi.MKTransitRouteResult;

import com.baidu.mapapi.MKWalkingRouteResult;  

import com.baidu.mapapi.MapActivity;  

import com.baidu.mapapi.MapController;

import com.baidu.mapapi.MapView;

import com.baidu.mapapi.Overlay;  

public class LocationActivity extends MapActivity implements LocationListener {

              private MapView mapView;  

              private MapController mMapCtrl;

              private List<Overlay> mapOverlays;

              public GeoPoint locPoint;  

              private MyMapOverlay mOverlay;

              private TextView desText;  

              private String lost_tips;

              private int point_X;  

              private int point_Y;  

              public final int MSG_VIEW_LONGPRESS = 10001;

              public final int MSG_VIEW_ADDRESSNAME = 10002;

              public final int MSG_GONE_ADDRESSNAME = 10003;  

              private Intent mIntent;

              private int mLatitude;  

              private int mLongitude;

              private String name;

              private BMapManager mapManager;

              private MKLocationManager mLocationManager = null;

              private boolean isLoadAdrr = true;

              private MKSearch mMKSearch;

          @Override

           public void onCreate(Bundle savedInstanceState) {  

                    super.onCreate(savedInstanceState);

                    requestWindowFeature(Window.FEATURE_NO_TITLE);

                    setContentView(R.layout.main);  

                    initMap();

                    mIntent = getIntent();

                    mLatitude = mIntent.getIntExtra("latitude", 0);

                    mLongitude = mIntent.getIntExtra("longitude", 0);  

                    name = mIntent.getStringExtra("name");  

                    mapView = (MapView) findViewById(R.id.map_view);

                    desText = (TextView) this.findViewById(R.id.map_bubbleText);

                    lost_tips = getResources().getString(R.string.load_tips);

                    if (mLatitude != 0 && mLongitude != 0) {  

                            locPoint = new GeoPoint((int) (mLatitude * 1E6),  

                           (int) (mLongitude * 1E6));  

                           desText.setText(name);  

                      }  

                     mapView.setBuiltInZoomControls(true);  

                     mapView.setClickable(true);

                     MapCtrl = mapView.getController();

                     point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2;  

                    point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2;

      mOverlay = new MyMapOverlay(point_X, point_Y) {

                  @Override  

      public void changePoint(GeoPoint newPoint, int type) {

                 if (type == 1) {  

                               mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME);  

              } else {  

                                locPoint = newPoint;  

                                mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);  

             }      

     }    

};

                   mapOverlays = mapView.getOverlays();  

                   if (mapOverlays.size() > 0) {  

                             mapOverlays.clear();    

                   }

                            mapOverlays.add(mOverlay);

                            mMapCtrl.setZoom(20);

                  }  

                  private void initMap() {

                          // 初始化MapActivity  

                            mapManager = new BMapManager(getApplication());

                         // init方法的第一个参数需填入申请的API Key

                           mapManager.init("C66C0501D0280744759A6957C42543AE38F5D540", null);

                           super.initMapActivity(mapManager);  

                       // 实例化搜索地址类

                           mMKSearch = new MKSearch();

                       // 初始化搜索地址实例  

                           mMKSearch.init(mapManager, new MySearchListener());

                          mLocationManager = mapManager.getLocationManager();

                       // 注册位置更新事件  

                          mLocationManager.requestLocationUpdates(this);  

                       // 使用GPS定位  

                          mLocationManager .enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);  

              }  

                   @Override

                   protected void onResume() {

                            if (mapManager != null) {  

                                     mapManager.start();  

                  }  

                            super.onResume();  

                  }

                  @Override  

                  protected void onPause() {

                             isLoadAdrr = false;  

                            if (mapManager != null) {  

                                           mapManager.stop();  

                  }.super.onPause();  

                  }  

                  @Override  

                    protected boolean isRouteDisplayed() {  

                    // TODO Auto-generated method stub

                               return false;  

                   }  

                      /** * 通过经纬度获取地址   ** @param point 151.    * @return 152.     */  

                 private String getLocationAddress(GeoPoint point) {

                                 String add = "";  

                                 Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());

                     try {  

                                  List<Address> addresses = geoCoder.getFromLocation(  

                                  point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6,  1);  

                                  Address address = addresses.get(0);

                                  int maxLine = address.getMaxAddressLineIndex();  

                  if (maxLine >= 2) {

                               add = address.getAddressLine(1) + address.getAddressLine(2);  

                   } else {  

                               add = address.getAddressLine(1);

                   }  

                   } catch (IOException e) {

                                add = "";  

                                e.printStackTrace();  

                    }  

                                   return add;

                   }

                   private Handler mHandler = new Handler() {

                     @Override

                                    public void handleMessage(Message msg) {

                                           switch (msg.what) {

                                                     case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息

                                            {

                                                     if (null == locPoint)

                                                     return;  

                                                     mMKSearch.reverseGeocode(locPoint);  

                                                     desText.setVisibility(View.VISIBLE);  

                                                     desText.setText(lost_tips);  

                                                     mMapCtrl.animateTo(locPoint);

                                                     mapView.invalidate();  

                                             }  

                                              break;  

                                                        case MSG_VIEW_ADDRESSNAME:  

                                                       desText.setText((String) msg.obj);  

                                                       desText.setVisibility(View.VISIBLE);  

                                             break;

                                                       case MSG_GONE_ADDRESSNAME:  

                                                       desText.setVisibility(View.GONE);

                                                       break;

                                              }  

                                       }  

                                   };

                                            // 关闭程序也关闭定位

                                    @Override  203.   

                                    protected void onDestroy() {

                                            if (mapManager != null) {

                                            mapManager.destroy();

                                            mapManager = null;  

                                    }

                                           super.onDestroy();  

                                    }  

                                    /*** 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置  */

                                 @Override

                                 protected boolean isLocationDisplayed() {

                                          return false;

                                 }

                                   /*** 当位置发生变化时触发此方法 ** @param locatio* 当前位置 */ 

                               public void onLocationChanged(Location location) {

                                               if (location != null) {

                                               locPoint = new GeoPoint((int) (location.getLatitude()* 1E6),  

                                              (int) (location.getLongitude()* 1E6));  

                                              mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);

                                           }  

                                     }

                                  /*** 内部类实现MKSearchListener接口,用于实现异步搜索服务 ** @author qiaoxu*/  

                                        public class MySearchListener implements MKSearchListener {  

                                                      /*** 根据经纬度搜索地址信息结果

                                                           * @param result

                                                           *搜索结果

                                                           * @param iError

                                                           * 错误号(0表示正确返回)

                                  */  

                                    public void onGetAddrResult(MKAddrInfo result, int iError) {

                                                  if (result == null) {

                                                            return;  .

                                                  }

                                                  Message msg = new Message();

                                                  msg.what = MSG_VIEW_ADDRESSNAME;  

                                                  msg.obj = result.strAddr;

                                                  mHandler.sendMessage(msg);

                                                 }  

                   /** * 驾车路线搜索结果

                         * @param result 2

                         *   搜索结果

                         * @param iError

                         *  错误号(0表示正确返回)

                    */

                    public void onGetDrivingRouteResult(MKDrivingRouteResult result,   int iError) {

                     }  

                     /*** POI搜索结果(范围检索、城市POI检索、周边检索*

                          * @param result

                          * 搜索结果 275

                          * @param type

                          *  返回结果类型(11,12,21:poi列表 7:城市列表)

                          * @param iError

                          * 错误号(0表示正确返回)

                     */

                        public void onGetPoiResult(MKPoiResult result, int type, int iError) {

                        }

                        /*** 公交换乘路线搜索结果

                             * @param result

                             * 搜索结果

                             * @param iError

                             *  错误号(0表示正确返回)

                             */    

               public void onGetTransitRouteResult(MKTransitRouteResult result,int iError) {  

               }

               /*** 步行路线搜索结果

                    * @param result

                    * 搜索结果

                    * @param iError

                    *  错误号(0表示正确返回)

                    */

                 public void onGetWalkingRouteResult(MKWalkingRouteResult result,  int iError) {

                }  

                public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {

                            // TODO Auto-generated method stub

                }  

                public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {

                      // TODO Auto-generated method stub  

                  }  

               }  

             } 

五:在AndroidManifest.xml住添加相关的访问权限

<!-- 访问网络的权限 --> Xml代码  [url=] 

 [/url]

1.    <uses-permission android:name="android.permission.INTERNET" />

2.    <!-- 访问精确位置的权限 --> 

3.    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

4.    <!-- 访问网络状态的权限 --> 

5.    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

6.    <!-- 访问WIFI网络状态的权限 --> 

7.    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

8.    <!-- 改变WIFI网络状态的权限 --> 

9.    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 

10.    <!-- 读写存储卡的权限 --> 

11.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

12.    <!-- 读取电话状态的权限 --> 

13.<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

作者:-xu 邮箱:860072925@qq.com QQ群:IOS/Android 25961346
原文地址:https://www.cnblogs.com/qiaoxu/p/3861841.html