Android 百度地图开发(二)
这一篇文章主要解说的是百度地图的定位功能,然后还有MyLocationOverlay和PopupOverlay两个地图覆盖物的使用。Overlay是“图层”或“覆盖物”的意思,MyLocationOverlay从名字上面理解就是我的位置图层,他可以实如今地图上显示当前位置的图标以及指南针,MyLocationOverlay仅仅负责显示我的位置,位置数据请使用百度定位SDK获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源。就可以创建MyLocationOverlay。PopupOverlay就是弹出窗体图层了,跟PopupWindow类似的东西,以下会介绍他们的用法
定位我们使用的是百度 Android 定位SDKv4.0。我们先了解下定位原理和定位精度
定位原理
使用百度Android定位SDK必须注冊GPS和网络使用权限。定位SDK採用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时。定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成对应定位根据进行定位。
用户能够设置满足自身需求的定位根据:
若用户设置GPS优先。则优先使用GPS进行定位,假设GPS定位未打开或者没有可用位置信息,且网络连接正常。定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
定位精度
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="400" height="240" alt="" style="border:none; max-width:100%">
了解了百度定位的原理和定位精度之后,接下来我们就来使用百度定位SDKv4.0吧
一 . 导入库文件
在使用百度定位SDKv4.0之前,我们要下载最新的库文件。下载地址:点击下载相关库文件。将liblocSDK4.so文件复制到libs/armeabi文件夹下。
将locSDK4.0.jar文件复制到project的libs文件夹下
二 . 布局文件。一个百度地图控件。加一个手动点击实现定位的button,放在一个相对布局里面,非常easy的布局
- <?
xml version="1.0" encoding="utf-8"?
>
 - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent" >
 - <com.baidu.mapapi.map.MapView
 - android:id="@+id/bmapView"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent"
 - android:clickable="true" />
 - <Button
 - android:id="@+id/request"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:layout_alignParentRight="true"
 - android:layout_alignParentTop="true"
 - android:layout_marginRight="10dp"
 - android:layout_marginTop="10dip"
 - android:background="@drawable/custom_loc" />
 - </RelativeLayout>
 
三 . 界面MainActivity代码,先贴上,然后适当解说相关代码,我凝视也比較清楚
- package com.example.baidumapdemo;
 - import android.app.Activity;
 - import android.graphics.Bitmap;
 - import android.os.Bundle;
 - import android.util.Log;
 - import android.view.LayoutInflater;
 - import android.view.View;
 - import android.view.View.MeasureSpec;
 - import android.view.View.OnClickListener;
 - import android.widget.Button;
 - import android.widget.TextView;
 - import android.widget.Toast;
 - import com.baidu.location.BDLocation;
 - import com.baidu.location.BDLocationListener;
 - import com.baidu.location.LocationClient;
 - import com.baidu.location.LocationClientOption;
 - import com.baidu.mapapi.BMapManager;
 - import com.baidu.mapapi.MKGeneralListener;
 - import com.baidu.mapapi.map.LocationData;
 - import com.baidu.mapapi.map.MKEvent;
 - import com.baidu.mapapi.map.MapController;
 - import com.baidu.mapapi.map.MapView;
 - import com.baidu.mapapi.map.MyLocationOverlay;
 - import com.baidu.mapapi.map.PopupClickListener;
 - import com.baidu.mapapi.map.PopupOverlay;
 - import com.baidu.platform.comapi.basestruct.GeoPoint;
 - public class MainActivity extends Activity {
 - private Toast mToast;
 - private BMapManager mBMapManager;
 - private MapView mMapView = null;
 - private MapController mMapController = null;
 - /**
 - * 定位SDK的核心类
 - */
 - private LocationClient mLocClient;
 - /**
 - * 用户位置信息
 - */
 - private LocationData mLocData;
 - /**
 - * 我的位置图层
 - */
 - private LocationOverlay myLocationOverlay = null;
 - /**
 - * 弹出窗体图层
 - */
 - private PopupOverlay mPopupOverlay = null;
 - private boolean isRequest = false;//是否手动触发请求定位
 - private boolean isFirstLoc = true;//是否首次定位
 - /**
 - * 弹出窗体图层的View
 - */
 - private View mPopupView;
 - private BDLocation location;
 - @Override
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - //使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化
 - mBMapManager = new BMapManager(this);
 - //第一个參数是API key,
 - //第二个參数是经常使用事件监听,用来处理通常的网络错误。授权验证错误等。你也能够不加入这个回调接口
 - mBMapManager.init("7ae13368159d6a513eaa7a17b9413b4b", new MKGeneralListenerImpl());
 - setContentView(R.layout.activity_main);
 - //点击button手动请求定位
 - ((Button) findViewById(R.id.request)).setOnClickListener(new OnClickListener() {
 - @Override
 - public void onClick(View v) {
 - requestLocation();
 - }
 - });
 - mMapView = (MapView) findViewById(R.id.bmapView); //获取百度地图控件实例
 - mMapController = mMapView.getController(); //获取地图控制器
 - mMapController.enableClick(true); //设置地图是否响应点击事件
 - mMapController.setZoom(14); //设置地图缩放级别
 - mMapView.setBuiltInZoomControls(true); //显示内置缩放控件
 - mMapView.setTraffic(true); //设置交通信息图
 - // mMapView.setSatellite(true); //设置卫星图
 - // mMapController.setOverlooking(-45); //设置地图鸟瞰角度 ,范围:0~ -45
 - mPopupView = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);
 - //实例化弹出窗体图层
 - mPopupOverlay = new PopupOverlay(mMapView ,new PopupClickListener() {
 - /**
 - * 点击弹出窗体图层回调的方法
 - */
 - @Override
 - public void onClickedPopup(int arg0) {
 - //隐藏弹出窗体图层
 - mPopupOverlay.hidePop();
 - }
 - });
 - //实例化定位服务。LocationClient类必须在主线程中声明
 - mLocClient = new LocationClient(getApplicationContext());
 - mLocClient.registerLocationListener(new BDLocationListenerImpl());//注冊定位监听接口
 - /**
 - * LocationClientOption 该类用来设置定位SDK的定位方式。
 - */
 - LocationClientOption option = new LocationClientOption();
 - option.setOpenGps(true); //打开GPRS
 - option.setAddrType("all");//返回的定位结果包括地址信息
 - option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
 - option.setPriority(LocationClientOption.GpsFirst); // 设置GPS优先
 - option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000ms
 - option.disableCache(false);//禁止启用缓存定位
 - // option.setPoiNumber(5); //最多返回POI个数
 - // option.setPoiDistance(1000); //poi查询距离
 - // option.setPoiExtraInfo(true); //是否须要POI的电话和地址等具体信息
 - mLocClient.setLocOption(option); //设置定位參数
 - mLocClient.start(); // 调用此方法開始定位
 - //定位图层初始化
 - myLocationOverlay = new LocationOverlay(mMapView);
 - //实例化定位数据。并设置在我的位置图层
 - mLocData = new LocationData();
 - myLocationOverlay.setData(mLocData);
 - //加入定位图层
 - mMapView.getOverlays().add(myLocationOverlay);
 - //改动定位数据后刷新图层生效
 - mMapView.refresh();
 - }
 - /**
 - * 定位接口,须要实现两个方法
 - * @author xiaanming
 - *
 - */
 - public class BDLocationListenerImpl implements BDLocationListener {
 - /**
 - * 接收异步返回的定位结果,參数是BDLocation类型參数
 - */
 - @Override
 - public void onReceiveLocation(BDLocation location) {
 - if (location == null) {
 - return;
 - }
 - StringBuffer sb = new StringBuffer(256);
 - sb.append("time : ");
 - sb.append(location.getTime());
 - sb.append("\nerror code : ");
 - sb.append(location.getLocType());
 - sb.append("\nlatitude : ");
 - sb.append(location.getLatitude());
 - sb.append("\nlontitude : ");
 - sb.append(location.getLongitude());
 - sb.append("\nradius : ");
 - sb.append(location.getRadius());
 - if (location.getLocType() == BDLocation.TypeGpsLocation){
 - sb.append("\nspeed : ");
 - sb.append(location.getSpeed());
 - sb.append("\nsatellite : ");
 - sb.append(location.getSatelliteNumber());
 - } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
 - sb.append("\naddr : ");
 - sb.append(location.getAddrStr());
 - }
 - Log.e("log", sb.toString());
 - MainActivity.this.location = location;
 - mLocData.latitude = location.getLatitude();
 - mLocData.longitude = location.getLongitude();
 - //假设不显示定位精度圈,将accuracy赋值为0就可以
 - mLocData.accuracy = location.getRadius();
 - mLocData.direction = location.getDerect();
 - //将定位数据设置到定位图层里
 - myLocationOverlay.setData(mLocData);
 - //更新图层数据运行刷新后生效
 - mMapView.refresh();
 - if(isFirstLoc || isRequest){
 - //将给定的位置点以动画形式移动至地图中心
 - mMapController.animateTo(new GeoPoint(
 - (int) (location.getLatitude() * 1e6), (int) (location
 - .getLongitude() * 1e6)));
 - showPopupOverlay(location);
 - isRequest = false;
 - }
 - isFirstLoc = false;
 - }
 - /**
 - * 接收异步返回的POI查询结果,參数是BDLocation类型參数
 - */
 - @Override
 - public void onReceivePoi(BDLocation poiLocation) {
 - }
 - }
 - //继承MyLocationOverlay重写dispatchTap方法
 - private class LocationOverlay extends MyLocationOverlay{
 - public LocationOverlay(MapView arg0) {
 - super(arg0);
 - }
 - /**
 - * 在“我的位置”坐标上处理点击事件。
 - */
 - @Override
 - protected boolean dispatchTap() {
 - //点击我的位置显示PopupOverlay
 - showPopupOverlay(location);
 - return super.dispatchTap();
 - }
 - }
 - /**
 - * 显示弹出窗体图层PopupOverlay
 - * @param location
 - */
 - private void showPopupOverlay(BDLocation location){
 - TextView popText = ((TextView)mPopupView.findViewById(R.id.location_tips));
 - popText.setText("[我的位置]\n" + location.getAddrStr());
 - mPopupOverlay.showPopup(getBitmapFromView(popText),
 - new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)),
 - 15);
 - }
 - /**
 - * 手动请求定位的方法
 - */
 - public void requestLocation() {
 - isRequest = true;
 - if(mLocClient != null && mLocClient.isStarted()){
 - showToast("正在定位......");
 - mLocClient.requestLocation();
 - }else{
 - Log.d("log", "locClient is null or not started");
 - }
 - }
 - /**
 - * 显示Toast消息
 - * @param msg
 - */
 - private void showToast(String msg){
 - if(mToast == null){
 - mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
 - }else{
 - mToast.setText(msg);
 - mToast.setDuration(Toast.LENGTH_SHORT);
 - }
 - mToast.show();
 - }
 - /**
 - * 将View转换成Bitmap的方法
 - * @param view
 - * @return
 - */
 - public static Bitmap getBitmapFromView(View view) {
 - view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
 - view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
 - view.buildDrawingCache();
 - Bitmap bitmap = view.getDrawingCache();
 - return bitmap;
 - }
 - /**
 - * 经常使用事件监听。用来处理通常的网络错误,授权验证错误等
 - * @author xiaanming
 - *
 - */
 - public class MKGeneralListenerImpl implements MKGeneralListener{
 - /**
 - * 一些网络状态的错误处理回调函数
 - */
 - @Override
 - public void onGetNetworkState(int iError) {
 - if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
 - showToast("您的网络出错啦!
");
 - }
 - }
 - /**
 - * 授权错误的时候调用的回调函数
 - */
 - @Override
 - public void onGetPermissionState(int iError) {
 - if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
 - showToast("API KEY错误, 请检查。");
 - }
 - }
 - }
 - @Override
 - protected void onResume() {
 - //MapView的生命周期与Activity同步。当activity挂起时需调用MapView.onPause()
 - mMapView.onResume();
 - super.onResume();
 - }
 - @Override
 - protected void onPause() {
 - //MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
 - mMapView.onPause();
 - super.onPause();
 - }
 - @Override
 - protected void onDestroy() {
 - //MapView的生命周期与Activity同步。当activity销毁时需调用MapView.destroy()
 - mMapView.destroy();
 - //退出应用调用BMapManager的destroy()方法
 - if(mBMapManager != null){
 - mBMapManager.destroy();
 - mBMapManager = null;
 - }
 - //退出时销毁定位
 - if (mLocClient != null){
 - mLocClient.stop();
 - }
 - super.onDestroy();
 - }
 - }
 
Android 百度地图开发(二)的更多相关文章
- Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
		
标签: Android百度地图API Key 分类: Android 百度地图开发(2) 最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...
 - Android百度地图(二)结合方向传感器我们自己定位哪里走
		
Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步改动.有 ...
 - C#的百度地图开发(二)转换JSON数据为相应的类
		
原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON ...
 - android 百度地图开发实例(转载)
		
因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...
 - [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索
		
一个. 百度地图城市位置和POI搜索知识 上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...
 - [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
		
近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--仅仅显示网格而没有显示地图,网 ...
 - Android 百度地图开发之一(Hello BaiDu Map)
		
之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图 ...
 - Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
		
转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...
 - Android百度地图开发(二)地图覆盖物
		
上一篇文章写道如何在一个mapview中简单的显示地图:本次学习一下如何在地图上添加一些覆盖物. 1.设置显示交通地图: // 显示交通地图 mapView.setTraffic(true); 2.设 ...
 
随机推荐
- ValueStack、ActionContext
			
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 1. ValueStac ...
 - node中fileSystem改promise
			
请注意,fs的大部分函数回调只会返回一个error参数,所以只要判断error为false的情况下就返回成功,无论有没有第二个参数. 另外exists需要单独包装,因为第一个参数就代表返回内容 con ...
 - 山贼集团 (group)
			
山贼集团 (group) 题目描述 某山贼集团在绿荫村拥有强大的势力,整个绿荫村由N个连通的小村落组成,并且保证对于每两个小村落有且仅有一条简单路径相连.小村落用阿拉伯数字编号为1,2,3,4,-,n ...
 - eclspse魔板
			
window->prefence->搜索 template即可
 - bzoj 4196 树链剖分 模板
			
[Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2135 Solved: 1232[Submit][Status][D ...
 - Playing with String(codeforces 305E)
			
题意:刚开始你只有一个字符串每次能选择一个有的字符串 s,找到 i,满足s[i - 1] = s[i + 1],将其分裂成 3 个字符串s[1 · · · i - 1]; s[i]; s[i + 1 ...
 - Linux服务器之SSH
			
SSH 1.ssh是安全的加密协议,用于远程连接linux服务器. 2.ssh默认端口是22,安全协议版本ssh2. 3.ssh服务端主要包含两个服务功能ssh远程连接,sftp服务. 4.linux ...
 - mdf 与 mdb的对比
			
下面的内容从网上搜索而来,未经过本人严格验证,仅供参考. 1.问:mdb数据库能否脱离Access运行?即,没有安装Access,可以打开mdb吗? 答:可以,脱离Access运行,可以到微软的同类产 ...
 - 《手把手教你学C语言》学习笔记(5)---计算机的存储和访问
			
数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是 ...
 - ARM QT实现多点触摸【转】
			
转自:http://www.cnblogs.com/sky1991/archive/2013/06/03/3114702.html http://www.ptrackapp.com/apclassys ...
 
			
		