Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 584|回复: 0

开发交流:Mars老师视频用户定位学习(附源码)

[复制链接]

该用户从未签到

发表于 2011-10-24 09:54:03 | 显示全部楼层 |阅读模式
       这些都是看mars老师视频学习的,大家可以去电驴上下他的视频,第三季,mars老师讲的确实好,我这是第一次看他的视频。
地址为:http://www.verycd.com/topics/2837883/
       示例代码都是按照mars老师的代码写的,因为网上没找到,我是自己写的,太麻烦了。作下标注吧:
Com.parabola.main:
GPSTestActivity: 这个是一个网友写的,我学习用的,大家看看吧,我感觉逻辑写的不清楚,不过没有问题,能运行
MainActivity: 基本使用,在DDMS中改变经纬度,查看变化情况
MainActivity2: 查看系统提供的定位方式,及根据条件查找当前最好的定位方法
MainActivity3: 改变检测的距离和时间,利用DDMS查看效果
MainActivity4: Geocoder的使用
Com.parabola.main2: 这个包中的3个类是一起的,模仿HTTP请求获取数据
注意加权限:
使用网络的权限:<uses-permission android:name="android.permission.INTERNET" />
定位权限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      Android 中的定位,主要涉及到两个重要的 API : Location Manager 和 Location Providers 。
Location Manager 是用于管理 Android 的用户定位服务 ;
Location Providers 则是提供了多种定位方式供开发者选择,主要包括 GPS 、 NETWORK 和PASSIVE 。
其中前两者是较为常用,最后一种我也不太清楚是什么方式。
GPS好像是使用卫星定位NETWORK好像是使用信号塔或者WIFI的基站定位。
如果要使用 GPS 定位,则需要声明 android.permission.ACCESS_FINE_LOCATION权限;
如果需要使用 NETWORK 定位,则需要声明android.permission.ACCESS_FINE_LOCATION 权限或android.permission.ACCESS_COARSE_LOCATION 权限。


需要进行定位,一般需要通过以下四个步骤:
1、  在 AndroidManifest.xml 当中声明相应的权限;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATON"/>
2、  获取 LocationManager 对象
//得到一个定位服务管理器          locationManager = (LocationManager)LifeMap.this.getSystemService(Context.LOCATION_SERVICE);
3、  选择 LocationProviders ;
/选择LocationProviders并绑定监听器  
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, theLocationListener);
4、  绑定 LocationListener 对象。
       既然定位有不同的 Providers ,那什么样的 Providers 对于我们来说是最合适的呢,这个就见仁见智了,得根据你自己的要求,然后再找出一个最为符合你的要求的 Providers 。 Android 中在android.location包中提供了一个类 Criteria ,其中有很方法用于设置我们需要的条件
setAccuracy (int accuracy) :设置精度,参数为 ACCURACY_COARSE 或 ACCURACY_FINE;
setAltitudeRequired (boolean altitudeRequired) :是否需要海拔信息,参数为: true 或 false ;
setBearingAccuracy (int accuracy) :设置方向的精度,参数为: ACCURACY_HIGH 或ACCURACY_LOW ;
setBearingRequired (boolean bearingRequired) :是否需要方向信息,参数为: true 或 false;、
setCostAllowed (boolean costAllowed) :是否产生费用,如流量费用等等,参数为: true 或false ;
setHorizontalAccuracy (int accuracy) :设置水平方向的精度,参数为: ACCURACY_HIGH 或ACCURACY_LOW 或 ACCURACY_MEDIUM ;
setPowerRequirement (int level) :设置电量的消耗,参数为 NO_REQUIREMENT, POWER_LOW, POWER_MEDIUM, 或 POWER_HIGH ;
setSpeedAccuracy (int accuracy) :设置速度的精度,其参数: ACCURACY_LOW ,ACCURACY_HIGH , 或 NO_REQUIREMENT ;
setSpeedRequired (boolean speedRequired) : 是否需要速度信息,参数为: true 或 false ;
setVerticalAccuracy (int accuracy) :垂直方向的精度,参数为: ACCURACY_LOW ,ACCURACY_MEDIUM , ACCURACY_HIGH 或 NO_REQUIREMENT
设置好这个 Criteria 对象后,就可以通过 LocationManager 的 getBestProvider (Criteriacriteria, boolean enabledOnly) 方向传入刚设置好的 Criteria 对象,以及一个布尔值,则可得到一个最合适的 Provider 。
注: enabledOnly 如果为 false 时,则在所有 Provider 中查找最合适的 Provider ;
     enabledOnly 如果为 true 时,则只在当前打开可用的 Provider 中查找最合适的 Provider 。
有时候我们需要精确定位用户的位置与经纬度之间的解析,我们可以用Google地图 HTTP解析地址或者Android给我们提供的Geocoder
但是在实际中我们又遇到了问题:
在android的API中提到:


The Geocoder class requires a backend service that is not included in the core android framework. The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists.



大意就是:
Geocoder类的使用描述在使用的前提是必须有 后台服务的支持,但是andorid sdk中不包含该服务的,模拟器可能模拟了该服务了。在真机上不一定存在。可以用isPresent() 检测一下,就知道有没有了。
这个错误经常使用:getFromLocation()与getFromLocationName()这两个函数会返回null值。
相关信息可以去code.google.com上查询:


我们可以直接利用http地址,实现地址查询:如:
根据地址查询经纬度:
http://maps.googleapis.com/maps/api/geocode/json?address=SFO&sensor=false
根据经纬度查询地址:
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false
bounds的作用
http://maps.googleapis.com/maps/ ... mp;amp;sensor=false
http://maps.googleapis.com/maps/api/geocode/json?address=Winnetka&bounds=34.172684,-118.604794|34.236144,-118.500938&sensor=false

region的作用
http://maps.googleapis.com/maps/ ... mp;amp;sensor=false
http://maps.googleapis.com/maps/api/geocode/json?address=Toledo&sensor=false?ion=es
      在上面这些方法,查询的都是显示json数据;senor表示,是否是来自传感器(比如手机上的传感器等)
bounds是在某个区域之间(定义一个矩形之内查询是不是有这个名字的地址)
region的作用是可选- 区域代码,指定为 ccTLD(“顶级域”)双字符值。(有关详细信息,请参见下文的区域偏向。)
详细信息也可以查看:http://code.google.com/intl/zh-CN/apis/maps/documentation/geocoding/
      当地址解析器传回结果时,它会将其放在一个 (JSON) results 数组中。即使地址解析器未传回任何结果(例如地址不存在),它仍会传回一个空 results 数组。(XML 响应包含零或多个 <result> 元素。)
一个典型的结果由以下字段组成:
.         types[] 数组指示传回结果的类型。此数组包含一个或多个标签,这些标签标识结果中返回的特征的类型。例如,对“Chicago”的地址解析返回“locality”,表示“Chicago”是一个城市;同时返回“political”,表示它是一个政治实体。
.         formatted_address 是一个字符串,包含此位置的人类可读地址。通常该地址相当于“邮政地址”,有时会因不同国家/地区而存在差异。(请注意,部分国家/地区会有许可限制,禁止发布真实的邮政地址,如英国。)此地址通常由一个或多个地址部分组成。例如,地址“111 8th Avenue, New York, NY”包含四个地址组成部分,即“111”(街道门牌号)、“8th Avenue”(街道地址)、“New York”(城市)和“NY”(美国的一个州)。这些地址组成部分包含附加信息,如下面所述。
.         address_components[] 是一个包含多个地址组成部分(如上文所述)的数组。每个 address_component 通常包含以下几个组成部分:
o    types[] 是一个数组,表示地址组成部分的类型。
o    long_name 是地址解析器传回的完整文本说明或地址组成部分的名称。
o    short_name 是地址组成部分的缩写文本名称(如果有)。例如,阿拉斯加州的地址组成部分可能具有 long_name“Alaska”和 short_name“AK”(使用 2 个字母的邮政缩写)。
请注意,address_components[] 包含的地址组成部分可能多于 formatted_address 中所注明的地址组成部分。
.         geometry 包含以下信息:
o    location 包含地址解析生成的纬度值和经度值。对于常规地址查询,此字段通常是最重要的。
o    location_type 存储有关指定位置的附加数据。当前支持以下值:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 01:18 , Processed in 0.368001 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表