zoukankan      html  css  js  c++  java
  • android 基于百度地图api开发定位以及获取详细地址

    一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 

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

     

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6.     <FrameLayout  
    7.         android:id="@+id/map_layout"  
    8.         android:layout_width="fill_parent"  
    9.         android:layout_height="fill_parent"  
    10.         android:orientation="vertical" >  
    11.         <!-- 百度MapView控件 -->  
    12.         <com.baidu.mapapi.MapView  
    13.             android:id="@+id/map_view"  
    14.             android:layout_width="fill_parent"  
    15.             android:layout_height="fill_parent"  
    16.             android:apiKey="0Mg_koWoyZUiYLfZxmPfp4LKInB5LqTnagYueaw"  
    17.             android:clickable="true"  
    18.             android:enabled="true" />  
    19.         <LinearLayout  
    20.             android:layout_width="wrap_content"  
    21.             android:layout_height="wrap_content"  
    22.             android:layout_gravity="center"  
    23.             android:orientation="vertical"  
    24.             android:paddingBottom="105dip" >  
    25.             <!-- 地址信息显示TextView -->  
    26.             <TextView  
    27.                 android:id="@+id/map_bubbleText"  
    28.                 android:layout_width="wrap_content"  
    29.                 android:layout_height="wrap_content"  
    30.                 android:background="@drawable/location_tips"  
    31.                 android:gravity="left|center"  
    32.                 android:maxEms="12"  
    33.                 android:paddingLeft="12dip"  
    34.                 android:paddingRight="10dip"  
    35.                 android:text="@string/load_tips"  
    36.                 android:textColor="#cfcfcf"  
    37.                 android:textSize="14sp" />  
    38.         </LinearLayout>  
    39.         <LinearLayout  
    40.             android:layout_width="wrap_content"  
    41.             android:layout_height="wrap_content"  
    42.             android:layout_gravity="center"  
    43.             android:orientation="vertical" >  
    44.             <!-- 位置指标显示ImageView -->  
    45.             <ImageView  
    46.                 android:id="@+id/point_image"  
    47.                 android:layout_width="wrap_content"  
    48.                 android:layout_height="wrap_content"  
    49.                 android:layout_gravity="center"  
    50.                 android:layout_marginBottom="30dip"  
    51.                 android:src="@drawable/point_start" />  
    52.         </LinearLayout>  
    53.     </FrameLayout>  
    54. </LinearLayout>  
     

     

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

     

    Java代码  收藏代码
    1. import android.view.MotionEvent;  
    2. import com.baidu.mapapi.GeoPoint;  
    3. import com.baidu.mapapi.MapView;  
    4. import com.baidu.mapapi.Overlay;  
    5. //覆盖整个地图捕捉触控事件的OverLay  
    6. public abstract class MyMapOverlay extends Overlay{  
    7. private int point_X;  
    8. private int point_Y;  
    9. private GeoPoint newPoint;  
    10. public MyMapOverlay(int x,int y){  
    11. point_X = x;  
    12. point_Y = y;  
    13. }  
    14. boolean flagMove=false;  
    15. //这里实现根据地图移动时重新获取屏幕中心点的经纬度坐标  
    16.     @Override   
    17.     public boolean onTouchEvent(MotionEvent event, MapView mapView) {  
    18.         System.out.println("X->"+event.getX()+":"+point_X);  
    19.         System.out.println("Y->"+event.getY()+":"+point_Y);  
    20.         if(event.getAction() == MotionEvent.ACTION_DOWN){  
    21.             changePoint(newPoint,1);  
    22.         }else if(event.getAction() == MotionEvent.ACTION_UP){  
    23.             newPoint = mapView.getProjection().fromPixels(point_X,point_Y);  
    24.             changePoint(newPoint,2);  
    25.         }         
    26.         return false;  
    27.     }  
    28.       
    29.     public abstract void changePoint(GeoPoint newPoint,int type);  
    30. }  
     

     

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

      package com.location.activity;
    Java代码  收藏代码
    1. import java.io.IOException;  
    2. import java.util.List;  
    3. import java.util.Locale;  
    4.   
    5. import android.content.Intent;  
    6. import android.location.Address;  
    7. import android.location.Geocoder;  
    8. import android.location.Location;  
    9. import android.os.Bundle;  
    10. import android.os.Handler;  
    11. import android.os.Message;  
    12. import android.view.View;  
    13. import android.view.Window;  
    14. import android.widget.TextView;  
    15.   
    16. import com.android.map.MyMapOverlay;  
    17. import com.baidu.mapapi.BMapManager;  
    18. import com.baidu.mapapi.GeoPoint;  
    19. import com.baidu.mapapi.LocationListener;  
    20. import com.baidu.mapapi.MKAddrInfo;  
    21. import com.baidu.mapapi.MKBusLineResult;  
    22. import com.baidu.mapapi.MKDrivingRouteResult;  
    23. import com.baidu.mapapi.MKLocationManager;  
    24. import com.baidu.mapapi.MKPoiResult;  
    25. import com.baidu.mapapi.MKSearch;  
    26. import com.baidu.mapapi.MKSearchListener;  
    27. import com.baidu.mapapi.MKSuggestionResult;  
    28. import com.baidu.mapapi.MKTransitRouteResult;  
    29. import com.baidu.mapapi.MKWalkingRouteResult;  
    30. import com.baidu.mapapi.MapActivity;  
    31. import com.baidu.mapapi.MapController;  
    32. import com.baidu.mapapi.MapView;  
    33. import com.baidu.mapapi.Overlay;  
    34.   
    35. public class LocationActivity extends MapActivity implements LocationListener {  
    36.   
    37.     private MapView mapView;  
    38.     private MapController mMapCtrl;  
    39.     private List<Overlay> mapOverlays;  
    40.     public GeoPoint locPoint;  
    41.     private MyMapOverlay mOverlay;  
    42.     private TextView desText;  
    43.     private String lost_tips;  
    44.     private int point_X;  
    45.     private int point_Y;  
    46.   
    47.     public final int MSG_VIEW_LONGPRESS = 10001;  
    48.     public final int MSG_VIEW_ADDRESSNAME = 10002;  
    49.     public final int MSG_GONE_ADDRESSNAME = 10003;  
    50.     private Intent mIntent;  
    51.     private int mLatitude;  
    52.     private int mLongitude;  
    53.     private String name;  
    54.     private BMapManager mapManager;  
    55.     private MKLocationManager mLocationManager = null;  
    56.     private boolean isLoadAdrr = true;  
    57.     private MKSearch mMKSearch;  
    58.   
    59.     @Override  
    60.     public void onCreate(Bundle savedInstanceState) {  
    61.         super.onCreate(savedInstanceState);  
    62.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
    63.         setContentView(R.layout.main);  
    64.         initMap();  
    65.         mIntent = getIntent();  
    66.         mLatitude = mIntent.getIntExtra("latitude", 0);  
    67.         mLongitude = mIntent.getIntExtra("longitude", 0);  
    68.         name = mIntent.getStringExtra("name");  
    69.         mapView = (MapView) findViewById(R.id.map_view);  
    70.         desText = (TextView) this.findViewById(R.id.map_bubbleText);  
    71.         lost_tips = getResources().getString(R.string.load_tips);  
    72.         if (mLatitude != 0 && mLongitude != 0) {  
    73.             locPoint = new GeoPoint((int) (mLatitude * 1E6),  
    74.                     (int) (mLongitude * 1E6));  
    75.             desText.setText(name);  
    76.         }  
    77.         mapView.setBuiltInZoomControls(true);  
    78.         mapView.setClickable(true);  
    79.         mMapCtrl = mapView.getController();  
    80.         point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2;  
    81.         point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2;  
    82.         mOverlay = new MyMapOverlay(point_X, point_Y) {  
    83.             @Override  
    84.             public void changePoint(GeoPoint newPoint, int type) {  
    85.                 if (type == 1) {  
    86.                     mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME);  
    87.                 } else {  
    88.                     locPoint = newPoint;  
    89.                     mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);  
    90.                 }  
    91.   
    92.             }  
    93.         };  
    94.         mapOverlays = mapView.getOverlays();  
    95.         if (mapOverlays.size() > 0) {  
    96.             mapOverlays.clear();  
    97.         }  
    98.         mapOverlays.add(mOverlay);  
    99.         mMapCtrl.setZoom(20);  
    100.   
    101.     }  
    102.   
    103.     private void initMap() {  
    104.   
    105.         // 初始化MapActivity  
    106.         mapManager = new BMapManager(getApplication());  
    107.         // init方法的第一个参数需填入申请的API Key  
    108.         mapManager.init("C66C0501D0280744759A6957C42543AE38F5D540", null);  
    109.         super.initMapActivity(mapManager);  
    110.         // 实例化搜索地址类  
    111.         mMKSearch = new MKSearch();  
    112.         // 初始化搜索地址实例  
    113.         mMKSearch.init(mapManager, new MySearchListener());  
    114.         mLocationManager = mapManager.getLocationManager();  
    115.         // 注册位置更新事件  
    116.         mLocationManager.requestLocationUpdates(this);  
    117.         // 使用GPS定位  
    118.         mLocationManager  
    119.                 .enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);  
    120.     }  
    121.   
    122.     @Override  
    123.     protected void onResume() {  
    124.         if (mapManager != null) {  
    125.             mapManager.start();  
    126.         }  
    127.         super.onResume();  
    128.   
    129.     }  
    130.   
    131.     @Override  
    132.     protected void onPause() {  
    133.         isLoadAdrr = false;  
    134.         if (mapManager != null) {  
    135.             mapManager.stop();  
    136.         }  
    137.         super.onPause();  
    138.     }  
    139.   
    140.     @Override  
    141.     protected boolean isRouteDisplayed() {  
    142.         // TODO Auto-generated method stub  
    143.         return false;  
    144.     }  
    145.   
    146.   
    147.     /** 
    148.      * 通过经纬度获取地址 
    149.      *  
    150.      * @param point 
    151.      * @return 
    152.      */  
    153.     private String getLocationAddress(GeoPoint point) {  
    154.         String add = "";  
    155.         Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());  
    156.         try {  
    157.             List<Address> addresses = geoCoder.getFromLocation(  
    158.                     point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6,  
    159.                     1);  
    160.             Address address = addresses.get(0);  
    161.             int maxLine = address.getMaxAddressLineIndex();  
    162.             if (maxLine >= 2) {  
    163.                 add = address.getAddressLine(1) + address.getAddressLine(2);  
    164.             } else {  
    165.                 add = address.getAddressLine(1);  
    166.             }  
    167.         } catch (IOException e) {  
    168.             add = "";  
    169.             e.printStackTrace();  
    170.         }  
    171.         return add;  
    172.     }  
    173.   
    174.   
    175.     private Handler mHandler = new Handler() {  
    176.         @Override  
    177.         public void handleMessage(Message msg) {  
    178.             switch (msg.what) {  
    179.             case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息  
    180.             {  
    181.                 if (null == locPoint)  
    182.                     return;  
    183.                 mMKSearch.reverseGeocode(locPoint);  
    184.                 desText.setVisibility(View.VISIBLE);  
    185.                 desText.setText(lost_tips);  
    186.                 mMapCtrl.animateTo(locPoint);  
    187.                 mapView.invalidate();  
    188.             }  
    189.                 break;  
    190.             case MSG_VIEW_ADDRESSNAME:  
    191.                 desText.setText((String) msg.obj);  
    192.                 desText.setVisibility(View.VISIBLE);  
    193.                 break;  
    194.             case MSG_GONE_ADDRESSNAME:  
    195.                 desText.setVisibility(View.GONE);  
    196.                 break;  
    197.             }  
    198.         }  
    199.     };  
    200.   
    201.     // 关闭程序也关闭定位  
    202.     @Override  
    203.     protected void onDestroy() {  
    204.         if (mapManager != null) {  
    205.             mapManager.destroy();  
    206.             mapManager = null;  
    207.         }  
    208.         super.onDestroy();  
    209.     }  
    210.   
    211.     /** 
    212.      * 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置 
    213.      */  
    214.     @Override  
    215.     protected boolean isLocationDisplayed() {  
    216.         return false;  
    217.     }  
    218.   
    219.     /** 
    220.      * 当位置发生变化时触发此方法 
    221.      *  
    222.      * @param location 
    223.      *            当前位置 
    224.      */  
    225.     public void onLocationChanged(Location location) {  
    226.         if (location != null) {  
    227.             locPoint = new GeoPoint((int) (location.getLatitude()* 1E6),  
    228.                     (int) (location.getLongitude()* 1E6));  
    229.             mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);  
    230.         }  
    231.     }  
    232.   
    233.     /** 
    234.      * 内部类实现MKSearchListener接口,用于实现异步搜索服务 
    235.      *  
    236.      * @author liufeng 
    237.      */  
    238.     public class MySearchListener implements MKSearchListener {  
    239.         /** 
    240.          * 根据经纬度搜索地址信息结果 
    241.          *  
    242.          * @param result 
    243.          *            搜索结果 
    244.          * @param iError 
    245.          *            错误号(0表示正确返回) 
    246.          */  
    247.         public void onGetAddrResult(MKAddrInfo result, int iError) {  
    248.             if (result == null) {  
    249.                 return;  
    250.             }  
    251.             Message msg = new Message();  
    252.             msg.what = MSG_VIEW_ADDRESSNAME;  
    253.             msg.obj = result.strAddr;  
    254.             mHandler.sendMessage(msg);  
    255.   
    256.         }  
    257.   
    258.         /** 
    259.          * 驾车路线搜索结果 
    260.          *  
    261.          * @param result 
    262.          *            搜索结果 
    263.          * @param iError 
    264.          *            错误号(0表示正确返回) 
    265.          */  
    266.         public void onGetDrivingRouteResult(MKDrivingRouteResult result,  
    267.                 int iError) {  
    268.         }  
    269.   
    270.         /** 
    271.          * POI搜索结果(范围检索、城市POI检索、周边检索) 
    272.          *  
    273.          * @param result 
    274.          *            搜索结果 
    275.          * @param type 
    276.          *            返回结果类型(11,12,21:poi列表 7:城市列表) 
    277.          * @param iError 
    278.          *            错误号(0表示正确返回) 
    279.          */  
    280.         public void onGetPoiResult(MKPoiResult result, int type, int iError) {  
    281.         }  
    282.   
    283.         /** 
    284.          * 公交换乘路线搜索结果 
    285.          *  
    286.          * @param result 
    287.          *            搜索结果 
    288.          * @param iError 
    289.          *            错误号(0表示正确返回) 
    290.          */  
    291.         public void onGetTransitRouteResult(MKTransitRouteResult result,  
    292.                 int iError) {  
    293.         }  
    294.   
    295.         /** 
    296.          * 步行路线搜索结果 
    297.          *  
    298.          * @param result 
    299.          *            搜索结果 
    300.          * @param iError 
    301.          *            错误号(0表示正确返回) 
    302.          */  
    303.         public void onGetWalkingRouteResult(MKWalkingRouteResult result,  
    304.                 int iError) {  
    305.         }  
    306.   
    307.         public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {  
    308.             // TODO Auto-generated method stub  
    309.   
    310.         }  
    311.   
    312.         public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {  
    313.             // TODO Auto-generated method stub  
    314.   
    315.         }  
    316.     }  
    317.   
    318. }  
     

     

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

     <!-- 访问网络的权限 -->

    Xml代码  收藏代码
    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" />  
     

     

    六:运行结果如下图:


     

  • 相关阅读:
    http://www.sqlservercentral.com/Forums/Topic6111071461.aspx
    SQL 2012 New Location for Query Templates
    How to Share Data between Stored Procedures
    DB Development Standard summary
    fn_SplitStringToTable
    PowerShell Database Server Disk Space Checking
    IIS支持htaccess的Rewrite3配置过程
    html select按纽代码
    jquery插件集 HA
    HTML基础特殊字符(易记版) HA
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3848755.html
Copyright © 2011-2022 走看看