您的位置:首页 > 移动开发 > Android开发

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

2017-03-21 14:29 483 查看


一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key,在这个博客里面有详细的说明和演示,(如果不懂得请看此文章) http://104zz.iteye.com/blog/1680781

 

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

 

Xml代码  


<?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代码  


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代码  


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);  

        mMapCtrl = 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 

     * @return 

     */  

    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  

    protected void onDestroy() {  

        if (mapManager != null) {  

            mapManager.destroy();  

            mapManager = null;  

        }  

        super.onDestroy();  

    }  

  

    /** 

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

     */  

    @Override  

    protected boolean isLocationDisplayed() {  

        return false;  

    }  

  

    /** 

     * 当位置发生变化时触发此方法 

     *  

     * @param location 

     *            当前位置 

     */  

    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 liufeng 

     */  

    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 

         *            搜索结果 

         * @param iError 

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

         */  

        public void onGetDrivingRouteResult(MKDrivingRouteResult result,  

                int iError) {  

        }  

  

        /** 

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

         *  

         * @param result 

         *            搜索结果 

         * @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代码  


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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

六:运行结果如下图:



 

baidumaplocation.zip (2.6 MB)
描述: 源码
下载次数: 3693
查看图片附件
转载自:http://104zz.iteye.com/blog/1681845
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐