android 基于百度地图api开发定位以及获取详细地址
一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key.
二:新建项目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" />
六:运行结果如下图:
- baidumaplocation.zip (2.6 MB)
android 基于百度地图api开发定位以及获取详细地址的更多相关文章
- 基于MFC与第三方类CWebPage的百度地图API开发范例
在进行百度地图API开发之前你需要到http://developer.baidu.com/map申请密匙 密匙申请之后就可以进行百度地图API的开发了. 下面我们以在visual c++6.0里进行地 ...
- 记录开发基于百度地图API实现在地图上绘制轨迹并拾取轨迹对应经纬度的工具说明
前言: 最近一直在做数据可视化方面的工作,其中平面可视化没什么难度,毕竟已经有很多成熟的可供使用的框架,比如百度的echart.js,highcharts.js等.还有就是3D可视化了,整体来说难度也 ...
- 利用百度地图api实现定位
使用百度地图api前需要先获取一个百度地图开放平台的访问应用AK, 获取百度地图开放平台访问应用AK方式:注册百度账号-->申请百度开发者-->获取密匙-->使用相关功能. 注册账号 ...
- 深入浅出百度地图API开发系列(1):前言
百度地图API目前在地图API领域越来越受到众多开发者的关注,许多应用都使用到了百度地图API服务,包括博主me,我自己使用做的是Javascript API,根据经验,我想整理出一份系列教程,如果能 ...
- 深入浅出百度地图API开发系列(2):创建地图
上一篇文章里,先介绍了一下百度地图API开发所涉及到的一些基础概念,包括投影,坐标系等基础概念,再有了这些基础后,我们可以开始开发自己的web地图了.先来个代码示例(建议大家都是用百度地图API大众版 ...
- 基于百度地图api + AngularJS 的入门地图
转载请注明地址:http://www.cnblogs.com/enzozo/p/4368081.html 简介: 此入门地图为简易的“广州大学城”公交寻路地图,采用很少量的AngularJS进行inp ...
- HTML5 调用百度地图API地理定位
<!DOCTYPE html> <html> <title>HTML5 HTML5 调用百度地图API地理定位实例</title> <head&g ...
- 百度地图api根据定位获取附近商家(只获取屏幕内)
根据中心点坐标计算出屏幕2个点(一个最低经纬度,一个最高经纬度),判断这两个点中间的所有坐标的商家..考虑屏幕分辨率之类 移动地图中心点变动,如何异步刷新,判断商家是否已经存在..等... 百度地图a ...
- Android定位&地图&导航——基于百度地图实现的定位功能
一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册 ...
随机推荐
- Entity Framework 增删改查和事务操作
1.增加对象 DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长主键外),如果不赋值,则会数据库中会被设置为NULL(注意是否 ...
- 数学(扩展欧几里得算法):HDU 5114 Collision
Matt is playing a naive computer game with his deeply loved pure girl. The playground is a rectangle ...
- MFC 状态栏相关使用(CStatusBar & CStatusBarCtrl)
原文:MFC 状态栏相关使用(CStatusBar & CStatusBarCtrl),沙漠紫风铃 本文介绍了MFC中和状态栏相关的用法: 在MFC的的单文档应用中,在建好应用程序之后,CMa ...
- C# 中winform的一些属性设置
1 窗体的大小固定住,不能调整其大小 窗体FormBorderStyle 属性设置为 FixedSingle; MaximizeBox 属性设置为false; MinimizeBox 属性设置为 ...
- java jvm学习笔记十(策略和保护域)
欢迎转载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271415 前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也 ...
- Month Calendar
http://www.codeproject.com/Articles/10840/Another-Month-Calendar#xx4614180xx Another Month Calendar ...
- HDU 2196-Computer(树形dp)
题意: 给出电脑网络连接树,求每个节点的为起点的最长距离 分析: 这道题开始状态想不出来,放了一段时间,后来注意到例题上有这道题,每个节点的最长距离可由父节点的最长距离,次长距离,和子节点的最长距离( ...
- lightoj 1015
水题,统计大于0的和. #include<cstdio> int main(){ int t, n, tmp; scanf("%d", &t); for(int ...
- mysql数据库基础的简单操作指南
最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...
- SQL Server: Difference Between Locking, Blocking and Dead Locking
Like ever, today’s article of Pinal Dave was interesting and informative. After, our mutual discussi ...