`
104zz
  • 浏览: 1508381 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

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

阅读更多

 

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

 

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

 

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

 

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;
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住添加相关的访问权限

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

    <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" />
 

 

六:运行结果如下图:


 

  • 大小: 103.7 KB
11
3
分享到:
评论
17 楼 LanSeTianKong12 2015-07-07  
闪退,为什么呢
16 楼 baiaijie 2015-06-13  
我的有停止运行了
15 楼 sonny_ 2015-04-22  
han5222 写道
4.2以上版本就不能用了

确实用不了了
14 楼 han5222 2015-03-26  
4.2以上版本就不能用了
13 楼 zh126613 2014-12-14  
闪退了 怎么回事啊
12 楼 lovewsb 2014-10-29  
xihuanderen 写道
您好!请问为什么将您代码放我电脑上运行时,报java.nio.bufferunderflowexception错误。请问这是什么原因?该怎么样去解决?

11 楼 u011522933 2014-09-15  
      很 好
10 楼 xihuanderen 2014-09-03  
您好!请问为什么将您代码放我电脑上运行时,报java.nio.bufferunderflowexception错误。请问这是什么原因?该怎么样去解决?
9 楼 movedream 2014-05-24  
你好,为什么会停止运行哈,是不是因为JAR包更新了?
8 楼 lauphai 2014-04-03  
闪退了。。。
7 楼 84771176 2013-12-19  
请教下 如何像嘀嘀打车那样获取到 所在地区的社区的名称
6 楼 细红蕊 2013-11-06  
您好!请问为什么将您代码放我电脑上运行时,报java.nio.bufferunderflowexception错误。请问这是什么原因?
5 楼 简屋_l 2013-06-13  
这个方法里取得onGetAddrResult  GeoPoint 转换的经纬度和result.stradd显示的不是一个地点 有比较大的偏差  不知楼主注意到这个问题没 求解  呵呵
4 楼 104zz 2012-10-12  
flycatdeng 写道
你这个getLocationAddress 方法没有用到,,,为什么点击绿色的之后能够显示位置呢?
requestWindowFeature(Window.FEATURE_NO_TITLE);   这一句有什么作用


getLocationAddress方法确实没有用到,但是这里用的是百度封装好的方法,从MKSearchListener 接口的onGetAddrResult方法获取到位置信息的

requestWindowFeature(Window.FEATURE_NO_TITLE);这句是去掉标题栏的
3 楼 flycatdeng 2012-10-11  
你这个getLocationAddress 方法没有用到,,,为什么点击绿色的之后能够显示位置呢?
requestWindowFeature(Window.FEATURE_NO_TITLE);   这一句有什么作用
2 楼 104zz 2012-10-07  
guohailing 写道
怎样在地图上显示的是你当前所在的位置

上面写得很清楚,你要是仔细看就懂了,首先获取到你当前的经纬度,然后根据经纬度来获取GeoPoint对象,得到这个对象后就可以使用百度api中的方法获取或者android中api的办法获取你当前的位置地址,你也可以通过别的办法获取,有时候获取到的位置并不准确这个跟你获取经纬度的方法有关
1 楼 guohailing 2012-10-05  
怎样在地图上显示的是你当前所在的位置

相关推荐

    Android-基于百度地图API实现定位功能

    总结来说,基于百度地图API实现Android定位功能需要完成SDK集成、API密钥配置、地图初始化、定位服务开启与监听、显示定位标记等一系列步骤。在实际开发中,还需要关注性能优化和异常处理,以确保应用的稳定性和用户...

    基于百度地图api开发手机地图

    在开发基于百度地图API的手机地图应用中,我们需要掌握一系列技术知识和技能,...以上就是基于百度地图API开发手机地图应用所需掌握的主要知识点,这些技术和实践将帮助开发者创建出功能强大且用户体验优秀的地图应用。

    基于android的百度地图应用

    在Android平台上开发基于百度地图的应用是一项常见的任务,它涉及到Android编程、网络通信、地理信息系统(GIS)以及百度地图API的使用。本项目标题为“基于android的百度地图应用”,其描述指出该应用功能虽简单但...

    基于Android的百度地图车辆定位系统设计与实现

    为了应对这一挑战,结合现代信息技术,特别是GPS定位技术和Android移动平台的发展,本文探讨了基于Android平台和百度地图API开发的车辆定位系统的设计与实现,该系统旨在提升车辆监控和调度的效率与便利性。...

    基于百度地图实现的定位功能

    本篇文章将详细讲解如何利用百度地图API实现定位功能,包括基本概念、工作原理以及实际应用步骤。 首先,我们需要了解百度地图定位服务的核心组件——百度定位SDK。它提供了强大的定位能力,支持GPS、基站、WIFI等...

    android 定时定位 (用的是百度地图定位API)

    总之,这个项目为开发者提供了一个关于如何在Android中利用百度地图API实现定时定位的实例,对于学习和实战具有很高的参考价值。通过深入理解和实践,开发者可以更好地掌握Android定位服务以及第三方API的集成技巧。

    基于Android的百度API旅游地图应用开发参赛作品完整版

    在本项目中,开发者利用了Android平台和百度地图API创建了一个旅游地图应用,这是一款针对旅行者设计的实用工具,可以提供丰富的地图服务和旅行相关信息。以下是对该项目各个方面的详细阐述: 1. **Android开发环境...

    基于百度地图api开发的安卓定位软件,秒定位精准

    在安卓平台上,开发一款基于百度地图API的定位软件可以实现高效、精准的地理位置服务。这款“秒定位精准”软件利用了百度地图强大的地理信息系统,为用户提供实时、准确的定位功能,尤其适合对安卓开发初学者进行...

    基于百度地图API -- 周边POI搜索

    本项目关注的是“基于百度地图API的周边POI(Point of Interest)搜索”,这是一个典型的地理定位与信息检索应用场景,主要涉及到Android平台上的开发。下面将详细阐述相关知识点: 1. **百度地图API**:百度地图...

    Android平台下基于百度地图API的地图导航设计.doc

    Android平台下基于百度地图API的地图导航设计 在本文中,我们将讨论基于百度地图API的地图导航设计在Android平台下的实现。该设计主要涉及到地图搜索、位置定位、附近搜索、路线规划、公交线路查询、GPS导航等功能...

    安卓GPS地图导航定位指南相关-Android百度地图API-定位周边搜索POI源码.rar

    本资源“安卓GPS地图导航定位指南相关-Android百度地图API-定位周边搜索POI源码.rar”提供了基于百度地图API实现的定位和周边搜索功能的源码,可以帮助开发者更好地理解和运用这些技术。 首先,我们要了解什么是GPS...

    利用百度地图API制作android地图应用

    在Android开发中,创建一款基于地图的应用是一项常见的需求,而百度地图API则为开发者提供了强大的地图功能支持。本文将深入探讨如何利用百度地图API来制作Android地图应用,以及实现地图上的位置搜索和周边信息显示...

    基于Android的百度地图的导航定位系统

    本文将深入探讨一个基于Android平台,利用百度地图API开发的导航定位系统,通过分析其核心技术和实现流程,为读者提供一份详尽的理解指南。 一、系统概述 基于Android的百度地图导航定位系统,主要由客户端应用和...

    Androidstudio3.0百度地图通过经纬度定位&地图类型转换

    在Android应用开发中,使用百度地图API是一种常见的实践,特别是在实现地理位置相关功能时。本文将深入探讨如何在Android Studio 3.0环境下,利用百度地图SDK实现基于经纬度的定位功能以及地图类型的切换,包括普通...

    Android使用百度地图API实现定位app

    在Android平台上开发一款基于百度地图API的定位应用,可以实现高效、精准的地理位置服务。本文将详细介绍如何利用百度地图SDK来构建这样的应用,包括集成步骤、权限设置、地图显示、定位功能实现以及常见问题的解决...

    百度地图api_百度地图API_百度地图_

    **周边搜索**是基于百度地图API实现的另一项重要功能。开发者可以通过关键词搜索,获取指定范围内的餐馆、酒店、公交站等地点信息,为用户提供生活服务推荐。同时,API还支持自定义POI(Point of Interest)数据,...

    Android 百度地图API-定位周边搜索POI源码

    在Android开发中,百度地图API是一个非常重要的工具,它提供了丰富的功能,如定位、路径规划、地图渲染等。本文将详细讲解如何利用百度地图API进行定位及周边搜索POI(Point of Interest)的源码实现。 首先,我们...

    Android百度地图画运动轨迹和GPS定位

    在Android开发中,使用百度地图API来实现运动轨迹和GPS定位是一项常见的功能。这个实训项目主要涉及以下几个核心知识点: 1. **百度地图API**:首先,你需要集成百度地图SDK到你的Android项目中。这通常包括在项目...

    Android 百度地图API-定位周边搜索POI源码.7z

    在Android开发中,百度地图API是一个非常重要的工具,它提供了丰富的功能,如定位、地图展示、路线规划、周边搜索等。这个"Android 百度地图API-定位周边搜索POI源码.7z"文件应该包含了一个完整的示例项目,用于演示...

Global site tag (gtag.js) - Google Analytics