分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-01-27

一、简介

Android定位SDK v6.2.2(全球定位支持)提供GPS、基站、Wi-Fi等多种定位方式,适用于室、内外多种定位场景:定位精度高(GPS精度10m,基站精度240m,Wi-Fi精度27m)、覆盖率广(移动、联通、电信全覆盖,基站覆盖率99%,WIFI覆盖率99%)、网络定位请求流量小(0.3K/次)、定位速度快(IP定位速度小于0.2S,正常环境下网络定位速度在1s以内)。

具体内容请参看百度官网的“开发指南”,网址:

http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/v5-0

1、使用定位

使用百度定位SDK获取相应的位置信息,然后利用地图SDK中的接口,您可以在地图上展示实时位置信息,核心代码如下:

protected override void OnCreate(Bundle savedInstanceState)

{

……

// 开启定位图层

mBaiduMap.MyLocationEnabled = true;

// 定位初始化

mLocationClient = new LocationClient(this);

mLocationClient.RegisterLocationListener(this);

InitLocation(); //详见源代码

mLocationClient.Start();

}

2、设置AndroidManifest.xml

在application标签中声明service组件,每个app需要拥有自己单独的定位service

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">

</service>

【重要提醒】

定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败。

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

3、使用综合定位功能

综合定位功能指的根据用户实际需求,返回用户当前位置的基础定位服务。包含GPS和网络定位(Wi-Fi和基站定位)功能。基本定位功能同时还支持结合定位结果的反地理编码功能,离线定位,位置提醒功能和位置语义化功能。

第一步,初始化LocationClient类

此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。

LocationClient类是定位SDK的核心类,具体方法详见类参考。

第二步,配置定位SDK参数

设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。

第三步,实现BDLocationListener接口

BDLocationListener接口有1个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。

BDLocation类封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。具体方法请参考类参考。

获取error code:见官网说明。

第四步,开始定位。

开启:mLocationClient.start();

start:启动定位SDK。 stop:关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。

开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop函数即可。

如果stop之后仍然想进行定位,可以再次start等待定位结果回调即可。

如果开发者想按照自己逻辑请求定位,可以在start之后按照自己的逻辑请求locationclient.requestLocation()函数,会主动触发定位SDK内部定位逻辑,等待定位回调即可。

4、位置提醒使用

位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。

5、需要注意的问题

l 定位SDK必须注册GPS和网络的使用权限。

l 使用定位SDK请尽量保证网络连接通畅(GPS定位方式不需要连网,但如果需要地址信息、位置语义化、POI等信息都需要联网的)。目前离线功能已经支持获取上述信息,但离线定位不是百分百都能定位成功的。

l 百度官网强烈建议您设置自己的prodName,并保管好,这样方便百度为您提供更好的定位服务。

l 若需要返回的定位结果里包含地址信息,请保证网络连接。因为GPS是本地获取的定位位置,在某些情况下有可能不带地址信息。

l 定位SDK可以返回bd09、bd09ll、gcj02三种类型坐标,若需要将定位点的位置通过百度Android地图 SDK进行地图展示,请返回bd09ll,将无偏差的叠加在百度地图上。

l 有的移动设备锁屏后为了省电会自动关闭网络连接,此时网络定位模式的定位失效。此外,锁屏后移动设备若进入cpu休眠,定时定位功能也失效。若需要实现在cpu休眠状态仍需定时定位,可以用AlarmManager 实现1个cpu可叫醒的timer,定时请求定位。

二、运行截图

简介:介绍定位图层的基本用法

详述:

(1)可自定义更换位置图标;

(2)支持定位三态效果显示(普通态、跟随态、罗盘态);

(3)百度地图SDK从2.0.0版本起,将定位功能进行了分离,具体使用方法请见定位SDK;

(4)定位SDK开发指南详见http://developer.baidu.com/map/geosdk-android.htm;

为了截图方便,本示例仍然用模拟器来演示,与真机的区别仅是模拟时需要手工添加模拟的定位位置。如果在真机上运行,必须去掉模拟的定位位置代码(详见源代码中的说明),否则就无法实际定位了。

三、设计步骤

在上一节例子的基础上,只需要再增加下面的步骤即可。

1、添加demo08_location.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <com.baidu.mapapi.map.TextureMapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="80dip"
android:background="#D000"
android:minWidth="100dip"
android:orientation="vertical"
android:padding="2dp" > <RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="定位icon" > <RadioButton
android:id="@+id/defaulticon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="默认图标" >
</RadioButton> <RadioButton
android:id="@+id/customicon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定义图标" >
</RadioButton>
</RadioGroup>
</LinearLayout> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="25dp"
android:layout_marginTop="10dip" /> </RelativeLayout>

2、添加Demo08Location.cs文件

在SrcSdkDemos文件夹下添加该文件,然后将其内容改为下面的代码:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Util;
using Android.Widget;
using Com.Baidu.Location;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using System.Collections.Generic;
using System.Text; namespace BdMapV371Demos.SrcSdkDemos
{
/// <summary>
/// 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡
/// </summary>
[Activity(ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden, Label = "@string/demo_name_location", ScreenOrientation = ScreenOrientation.Sensor)]
public class Demo08Location : Activity, IBDLocationListener
{
LocationClient mLocationClient;
TextureMapView mMapView;
BaiduMap mBaiduMap;
bool isFirstLoc = true;// 是否首次定位 protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.demo08_location);
Button requestLocButton = FindViewById<Button>(Resource.Id.button1);
MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.Normal;
BitmapDescriptor mCurrentMarker=null;
requestLocButton.Text = "普通";
requestLocButton.SetBackgroundColor(Android.Graphics.Color.YellowGreen);
requestLocButton.Click += delegate
{
if (mCurrentMode.Equals(MyLocationConfiguration.LocationMode.Normal))
{
requestLocButton.Text = "跟随";
mCurrentMode = MyLocationConfiguration.LocationMode.Following;
mBaiduMap.SetMyLocationConfigeration(
new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
}
else if (mCurrentMode.Equals(MyLocationConfiguration.LocationMode.Compass))
{
requestLocButton.Text = "普通";
mCurrentMode = MyLocationConfiguration.LocationMode.Normal;
mBaiduMap.SetMyLocationConfigeration(
new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
}
else if (mCurrentMode.Equals(MyLocationConfiguration.LocationMode.Following))
{
requestLocButton.Text = "罗盘";
mCurrentMode = MyLocationConfiguration.LocationMode.Compass;
mBaiduMap.SetMyLocationConfigeration(
new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
}
}; RadioGroup group = FindViewById<RadioGroup>(Resource.Id.radioGroup);
group.SetBackgroundColor(Android.Graphics.Color.YellowGreen); group.CheckedChange += (sender, args) =>
{
int checkedId = args.CheckedId;
if (checkedId == Resource.Id.defaulticon)
{
// 传入null则恢复默认图标
mCurrentMarker = null;
mBaiduMap.SetMyLocationConfigeration(
new MyLocationConfiguration(mCurrentMode, true, null));
}
if (checkedId == Resource.Id.customicon)
{
// 修改为自定义marker
mCurrentMarker = BitmapDescriptorFactory
.FromResource(Resource.Drawable.icon_geo);
mBaiduMap.SetMyLocationConfigeration(
new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
}
}; // 地图初始化
mMapView = FindViewById<TextureMapView>(Resource.Id.bmapView);
mBaiduMap = mMapView.Map;
mBaiduMap.SetMapStatus(MapStatusUpdateFactory.NewLatLng(MainActivity.HeNanUniversity)); // 开启定位图层
mBaiduMap.MyLocationEnabled = true;
// 定位初始化
mLocationClient = new LocationClient(this);
mLocationClient.RegisterLocationListener(this);
InitLocation();
mLocationClient.Start();
}
private void InitLocation()
{
LocationClientOption option = new LocationClientOption();
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.SetLocationMode(LocationClientOption.LocationMode.HightAccuracy);
//可选,默认gcj02,设置返回的定位结果坐标系
//其中:bd09为墨卡托平面坐标[单位:米],gcj02为经纬度坐标[单位:度]
option.CoorType = "bd09ll";
int span = ;
//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.ScanSpan = span;
//可选,设置是否需要地址信息,默认不需要
option.SetIsNeedAddress(true);
//可选,默认false,设置是否使用gps
option.OpenGps = true;
//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.LocationNotify = true;
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.GetLocationDescribe里得到,结果类似于“在北京天安门附近”
option.SetIsNeedLocationDescribe(true);
//可选,默认false,设置是否需要POI结果,可以在BDLocation.GetPoiList里得到
option.SetIsNeedLocationPoiList(true);
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.IsIgnoreKillProcess = false;
//可选,默认false,设置是否收集CRASH信息,默认收集
option.IsIgnoreCacheException=false;
//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
option.EnableSimulateGps = false;
mLocationClient.LocOption = option;
} //实现接口
public void OnReceiveLocation(BDLocation p0)
{
// map view 销毁后不再处理新接收的位置
if (p0 == null || mMapView == null) return; #region 模拟位置
//注意:在手机上运行应注释掉这段代码,否则定位就没有意义了
p0 = new BDLocation();
p0.LocationDescribe = "模拟的位置,目的是为了在模拟器中查看运行效果";
p0.Radius = ;
p0.Latitude = MainActivity.HeNanUniversity.Latitude;
p0.Longitude = MainActivity.HeNanUniversity.Longitude;
#endregion 模拟位置 MyLocationData locData = new MyLocationData.Builder()
.Accuracy(p0.Radius)
// 此处设置开发者获取到的方向信息,顺时针0-360
.Direction().Latitude(p0.Latitude)
.Longitude(p0.Longitude).Build();
mBaiduMap.SetMyLocationData(locData);
if (isFirstLoc)
{
isFirstLoc = false;
LatLng ll = new LatLng(p0.Latitude, p0.Longitude);
MapStatusUpdate u = MapStatusUpdateFactory.NewLatLng(ll);
mBaiduMap.AnimateMapStatus(u);
} //Receive Location
StringBuilder sb = new StringBuilder();
sb.AppendLine("time : "+p0.Time);
sb.AppendLine("error code : "+p0.LocType);
sb.AppendLine("latitude : "+p0.Latitude);
sb.AppendLine("lontitude : "+p0.Longitude);
sb.AppendLine("radius : "+p0.Radius);
switch(p0.LocType)
{
case BDLocation.TypeGpsLocation:
// GPS定位结果
sb.AppendLine("speed : " + p0.Speed);// 单位:公里/每小时
sb.AppendLine("satellite : " + p0.SatelliteNumber);
sb.AppendLine("height : " + p0.Altitude);// 单位:米
sb.AppendLine("direction : " + p0.Direction);// 单位度
sb.AppendLine("addr : " + p0.AddrStr);
sb.AppendLine("describe : gps定位成功");
break;
case BDLocation.TypeNetWorkLocation:
// 网络定位结果
sb.AppendLine("网络定位结果(addr) : " + p0.AddrStr);
//运营商信息
sb.AppendLine("运营商信息(operationers) : " + p0.Operators);
sb.AppendLine("describe : 网络定位成功");
break;
case BDLocation.TypeOffLineLocation:
// 离线定位结果
sb.AppendLine("describe : 离线定位成功,离线定位结果也是有效的");
break;
case BDLocation.TypeServerError:
sb.AppendLine("describe : 服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
break;
case BDLocation.TypeNetWorkException:
sb.AppendLine("describe : 网络不同导致定位失败,请检查网络是否通畅");
break;
case BDLocation.TypeCriteriaException:
sb.AppendLine("describe : 无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
break;
}
sb.AppendLine("locationdescribe: "+p0.LocationDescribe);// 位置语义化信息
var list = p0.PoiList;// POI数据
if (list != null)
{
sb.AppendLine("poilist size = : "+list.Count);
foreach (Poi p in list)
{
sb.AppendLine();
sb.AppendFormat("poi= : {0} {1} {2}",p.Id,p.Name,p.Rank);
}
}
Log.Debug("BaiduLocationApiDem", sb.ToString());
} protected override void OnPause()
{
mMapView.OnPause();
base.OnPause();
} protected override void OnResume()
{
mMapView.OnResume();
base.OnResume();
} protected override void OnDestroy()
{
// 退出时销毁定位
mLocationClient.Stop();
// 关闭定位图层
mBaiduMap.MyLocationEnabled = false;
mMapView.OnDestroy();
mMapView = null;
base.OnDestroy();
}
}
}

3、修改MainActivity.cs

在MainActivity.cs文件的demos字段定义中,去掉【示例8】下面的注释。

运行观察结果。

【Android】3.8 定位图层展示的更多相关文章

  1. 【Android】3.4 图层展示

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 3.4 示例4--图层展示 一.简介 1.地图类型 百度地图Android SDK 3.7.1提供了两种类型的 ...

  2. android百度地图定位开发

    一.activity import android.app.Activity; import android.graphics.Point;import android.graphics.PointF ...

  3. android 百度地图定位开发2

    先下载了示例代码 进行配置(可查看开发 指南 Hello BaiDuMap) 第一步:创建并配置工程(具体方法参见工程配置部分的介绍): 第二步:在AndroidManifest中添加开发密钥.所需权 ...

  4. Android 百度地图定位(手动+自动) 安卓开发教程

    近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置.  经过2天研究 ...

  5. android 百度地图定位功能实现

    历经几天时间,终于把定位功能给实现了,可谓是费劲千辛万苦啊,有定位知识还有图层知识,在这里我把代码给大家贴出来,一起分享一下下啦. package com.example.foreveross.off ...

  6. Android百度地图定位

    在谈到百度地图.如今,每个人都知道这个时候应该可以了吧.而更多的字不拉.直接朝话题. 访问百度地图api您必须应用key,应用在这里key不用说,有官方的文件说明如何应用上述key. 在这里,百度地图 ...

  7. Arcgis For Android之GPS定位实现

    翻开曾经做的东西,看了看,非常多从逻辑上比較乱,对之做了改动,完毕后实现的效果为: MapActivity源码例如以下: package com.lzugis.map; import java.io. ...

  8. Appium python自动化测试系列之Android UIAutomator终极定位(七)

    android uiautomator text定位 可能有人不知道为什么说android uiautomator是终极定位,而且android uiautomator和appium有什么关系呢?如果 ...

  9. 我的Android进阶之旅------>Android百度地图定位SDK功能学习

    因为项目需求,需要使用百度地图的定位功能,因此去百度地图开发平台下载了百度地图的Android定位SDK最新版本的开发包和示例代码学习. Android 定位SDK地址:http://develope ...

随机推荐

  1. redis队列及多线程应用

    由于xxx平台上自己的博客已经很久没更新了,一直以来都是用的印象笔记来做工作中知识的积累存根,不知不觉印象笔记里已经有了四.五百遍文章.为了从新开始能与广大攻城狮共同提高技术能力与水平,随决心另起炉灶 ...

  2. STL - 容器 - Array

    Array是C++ 11给STL新增加的容器 ArrayTest.cpp #include <array> #include <algorithm> #include < ...

  3. Centos6.6系统root用户密码恢复案例(转)

    原文:http://www.centoscn.com/CentOS/Intermediate/2015/0131/4604.html 通过单用户模式恢复root用户密码 重新启动主机后,在出现Grub ...

  4. Java中执行存储过程和函数(web基础学习笔记十四)

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  5. Oracle体系结构三(学习笔记)

  6. vue Watcher分类 computed watch

    1.Watcher构造函数源码部分代码 if (options) { this.deep = !!options.deep this.user = !!options.user this.lazy = ...

  7. javascript 1.5s跳转

    <script type="text/javascript"> var t = 1.5; window.onload=countDown; function count ...

  8. Java类(继承)初始化顺序

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  9. java上传excel文件及解析

      java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...

  10. VC2012编译CEF3-转

    原文地址:http://blog.csdn.net/tiplip/article/details/42047815 下载 代码下载:http://cefbuilds.com/,CEF 3.2556.1 ...