android中GPS信息的获取
安卓(Android)全球定位(GPS)浅层调优原理及其方法
要弄明白i9000的GPS、AGPS,最好先要对GPS相关一些概念有些了解。
:关于GPS,AGPS,SUPL XTRA,星历;冷启动、暖启动、热启动等,各位可以先百度一下,有个了解,概念如果清楚了,那么请注意:一、I9000的GPS操作模式中的MS base 模式:(接受GPS基站导航信息由手机计算并定位),MS assisted模式(定位信息由手机基站计算后发给手机定位),此两种模式为真正的AGPS模式,SUPL也是通过MS BASE 模式实现的,此服务可能需手机运营商支持才行,我的手机是移动G网的,选了此两种模式均没有任何流量产生,在NMEA输出语句也未见$GPCELL或$SUPL语句,定位效果也未见加快,因此可以说I9000 的SUPl AGPS是没有用的。
哪位兄弟用联通或者3G的试试,如果能打开I9000的SUPL AGPS,那也是I9000的福音了。
二、I9000的AGPS不是真正联机在线的AGPS,而是离线式的APGS,即XTRA模式(I9000中所谓的GPS-PLUS模式),类似于AGPS功能,在GPS没搜到卫星之前,先利用网络下载星历数据,然后通过星历数据就能够很快找到可使用的卫星,从而提高搜星速度。
打开R.E管理器,进入\data\GPS 目录,正常设定后会有如下5个文件,此5个文件可以删除的,联网打开GPS后文件都会更新的:1、gldata.sto此文件是GPS Location(GPS定位)数据,这是GPS芯片从GPS卫星上得到的数据,不联网只开GPS时,数据一颗一颗接受较慢,联网后较快,此文件长度会有变化,数据离当前越近,长度越长,则定位越快。
2、lbsdata.sto此文件是位置服务数据,由GPS 测试工程模式(LBS测试模式)产生,此文件可有可无。
3、lto.data此文件即为下载的XTRA 星历数据,I9000快速定位,主要依靠此数据,数据离当前越近,定位越快。
(此数据也可用GPS软件GPS_STATUS 更新)。
安卓手机怎么定位
安卓手机怎么定位在现代社会的信息时代,定位功能成为了智能手机中一个非常重要的功能之一。
利用定位功能,我们可以随时随地知道自己所处的位置,找到自己的目的地。
本文将为大家介绍安卓手机的定位功能以及如何使用它。
安卓手机具有内置的GPS(全球定位系统)功能,通过与卫星的通信,可以精确地确定手机和用户的位置。
在定位服务打开的情况下,安卓手机可以通过GPS、蜂窝数据和Wi-Fi联网等方式,获取用户的位置信息。
要开启安卓手机的定位功能,我们可以按照以下步骤进行操作:1. 打开手机的设置应用程序。
2. 滑动屏幕并找到“位置”或“定位”选项。
3. 点击“位置”或“定位”选项,进入位置设置页面。
4. 在位置设置页面中,确认开启“定位服务”开关。
一旦开启了定位功能,我们就可以通过多种方式进行定位。
第一种方式是使用安卓手机自带的地图应用程序。
大多数安卓手机都预装了Google Maps应用程序,该应用程序不仅可以提供详细的地图信息,还可以使用GPS定位功能。
通过Google Maps,我们可以在地图上标记自己的位置,并获取详细的导航路线。
第二种方式是使用第三方的定位应用程序。
在Google Play商店中,有许多免费和付费的定位应用程序可供选择。
这些应用程序提供了不同的定位功能和使用界面,可以根据自己的需求选择合适的应用程序进行定位。
除了地图应用程序和定位应用程序外,安卓手机还可以根据用户的需求,通过其他应用程序进行定位。
例如,在社交媒体应用程序中,我们可以使用定位功能与朋友共享自己的位置。
在出行应用程序中,我们可以使用定位功能查找附近的餐厅、酒店和商店等。
安卓手机的定位功能不仅可以用于个人使用,还可以用于商业和应急领域。
例如,在某些商业应用场景中,可以通过安卓手机的定位功能对物品进行追踪和管理。
在紧急情况下,安卓手机的定位功能可以被用来定位受困人员的位置,以便进行救援。
定位功能的应用范围越来越广泛,给人们的生活和工作带来了许多便利。
基于Android系统智能手机的GPS定位功能的设计与实现
基于Android系统智能手机的GPS定位功能的设计与实
现
在基于Android系统智能手机的GPS定位功能的设计与实现时,需要考虑以下几个方面。
1. 确定需求和功能:明确应用的定位需求和功能,例如地图定位、导航、行车记录和位置共享等,以确定需要使用何种GPS定位
服务和相关API。
2. 获取定位权限:在Android系统中,需要申请定位权限才能
使用GPS定位服务。
可以在应用中使用系统提供的API或者在清单
文件中声明权限来获取定位权限。
3. 调用系统定位服务:在使用GPS定位服务时,可以通过系统
提供的LocationManager类来获得Location对象,并获取定位信息。
4. 实现定位功能:在获得定位信息后,可以将其在应用中进行
处理,例如在地图上展示当前位置、提供导航指引等。
可以使用第
三方地图SDK来实现这些功能。
5. 处理定位异常:在使用GPS定位时,可能会出现一些异常情况,例如定位时间过长、定位数据不准确等。
需要进行异常处理,
保证应用的稳定性和准确性。
总体来说,在基于Android系统智能手机的GPS定位功能的设
计与实现时,需要详细了解系统提供的GPS定位服务和相关API,
根据需求和功能进行适当的选择和配置,并进行异常处理和优化,
以便实现高效、稳定和准确的定位功能。
手机的gps工作原理
手机的gps工作原理
手机的GPS(全球定位系统)工作原理是基于卫星导航系统,主要分为三个步骤:接收、计算和定位。
1. 接收:手机通过内置的GPS芯片接收来自卫星的无线电信号。
GPS系统由24颗绕地球轨道运行的卫星组成,这些卫星
以不同的轨道高度和角度分布在全球范围内,确保至少可见4
颗卫星。
手机接收到的信号中包含有关卫星的位置、速度和时间信息。
2. 计算:手机通过计算接收到信号的时间差来确定当前手机和卫星之间的距离。
每颗卫星都会发送信号,并且包含其位置和发送的时间。
手机接收到多颗卫星的信号后,将计算每颗卫星与手机之间的距离,并使用三角定位算法来确定手机所在的位置。
为了提高定位精度,手机需要收集尽可能多的卫星信号。
3. 定位:通过计算得到的卫星距离和位置信息,手机可以利用三角定位算法确定自身的位置。
三角定位算法使用三个或更多卫星信号交叉定位,使用卫星之间的距离差异来计算手机与卫星之间的相对位置。
一旦手机与足够多的卫星建立了通信,并根据其相对位置计算了自身的经纬度,就能够确定手机的准确位置。
需要注意的是,GPS系统的精度和可用性受到许多因素的影响,例如卫星的位置、地形、气候条件以及可能存在的信号干扰等。
此外,使用手机的GPS功能还需要手机具备开启位置
服务的权限,并且能够与移动网络或Wi-Fi网络进行通信,以获取卫星信号和进行定位计算。
android定位原理
android定位原理Android定位原理是指利用Android设备内置的各种定位技术和传感器来获取用户的地理位置信息。
Android设备通常会使用GPS(Global Positioning System)、网络定位和传感器融合定位等技术来实现定位功能。
GPS定位是指利用卫星信号来确定设备的精确地理位置。
Android设备通过内置的GPS芯片接收卫星信号,然后利用三角测量原理计算出设备的经纬度坐标。
GPS定位的优点是精确度高,可用于室外环境。
然而,GPS信号在室内、高楼群等环境下可能受到干扰,定位精确度会降低。
网络定位是指通过连接到网络来获取设备的大致地理位置。
Android设备可以使用Wi-Fi、移动网络信号、蓝牙等来进行网络定位。
通过扫描附近的Wi-Fi和移动信号基站,设备可以获取到周围网络设备的位置信息。
由于网络设备通常分布广泛,所以网络定位的精确度相对较低,但在室内和GPS信号较弱的情况下,网络定位仍然可以提供相对准确的位置信息。
传感器融合定位是指将多种传感器的数据进行融合,从而获取更准确的位置信息。
Android设备常用的传感器包括加速度计、陀螺仪、磁力计等。
通过分析这些传感器的数据,可以获得设备的加速度、方向、旋转等信息,从而推算出设备的运动轨迹和姿态变化。
传感器融合定位结合了GPS和网络定位的优点,可以在各种环境下提供更准确的定位结果。
总结起来,Android定位原理主要包括GPS定位、网络定位和传感器融合定位。
通过使用这些技术,Android设备可以获取用户的地理位置信息,为用户提供定位服务。
android中gnssstatus的用法
android中gnssstatus的用法GNSSStatus 是 Android 中的类,用于获取全球卫星导航系统(Global Navigation Satellite System,简称 GNSS)的状态信息。
GNSS 包括全球定位系统(GPS)、伽利略卫星导航系统(Galileo)、格洛纳斯系统(GLONASS)和北斗卫星导航系统(BeiDou)等。
在 Android 开发中,开发者可以使用 GNSSStatus 类来获取设备当前的 GNSS 状态信息,包括已连接的卫星数量、卫星的信号强度、卫星的位置、卫星的类型等。
通过获取这些状态信息,开发者可以更好地了解设备的定位情况,并据此进行相应的处理。
使用 GNSSStatus 类的步骤如下:1. 获取 LocationManager 对象:```javaLocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);```2. 创建一个 LocationListener 对象,并在其onLocationChanged() 方法中处理 GNSS 状态信息:```javaLocationListener locationListener = newLocationListener() {@Overridepublic void onLocationChanged(Location location) {// 获取 GNSS 状态信息GnssStatus gnssStatus =locationManager.getGnssStatus();// 处理 GNSS 状态信息// ...// 可以通过 gnssStatus.getSatelliteCount() 方法获取已连接的卫星数量int satelliteCount =gnssStatus.getSatelliteCount();// 通过循环获取每颗卫星的具体信息for (int i = 0; i < satelliteCount; i++) {// 获取卫星的信号强度float cn0DbHz = gnssStatus.getCn0DbHz(i);// 获取卫星的位置float azimuth =gnssStatus.getAzimuthDegrees(i);float elevation =gnssStatus.getElevationDegrees(i);// ...}}// 其他方法省略};```3. 注册 LocationListener 对象,开始监听位置更新:```javalocationManager.requestLocationUpdates(LocationManager.G PS_PROVIDER, 0, 0, locationListener);```通过以上步骤,就可以使用 GNSSStatus 类来获取设备的 GNSS 状态信息了。
android 虚拟定位实现原理
android 虚拟定位实现原理
Android虚拟定位的实现原理主要是利用模拟GPS数据,通过模拟器或特
定应用程序来模拟GPS坐标,从而实现虚拟定位的效果。
具体来说,实现虚拟定位的步骤如下:
1. 获取模拟GPS数据:通过模拟器或特定应用程序生成模拟的GPS数据,包括经纬度、高度等信息。
这些数据可以是任意指定的位置,可以根据需要进行设置。
2. 注入模拟GPS数据:将模拟的GPS数据注入到Android系统的GPS服务中。
这通常涉及到修改系统设置或使用特定权限来访问GPS服务。
3. 模拟位置更新:通过定期发送模拟的GPS数据,模拟器或应用程序可以
模拟设备的位置更新。
这使得应用程序和系统服务认为设备正在移动,从而实现虚拟定位的效果。
4. 测试和验证:在完成虚拟定位设置后,需要进行测试和验证,以确保虚拟定位功能正常工作。
这包括检查应用程序是否正确地接收到了虚拟位置信息,以及系统服务是否正确地响应了虚拟位置更新。
需要注意的是,虚拟定位的实现需要具备一定的技术知识和编程能力。
此外,由于涉及到系统级别的修改和权限访问,虚拟定位可能会对设备的稳定性和
安全性产生影响。
因此,在使用虚拟定位功能时,建议谨慎操作并遵循相关法律法规和隐私政策。
客户端开发教程:学会使用常见的地图定位技术(四)
客户端开发教程:学会使用常见的地图定位技术随着智能手机的普及和移动应用的快速发展,地图定位技术在客户端开发中变得越来越重要。
无论是基于地理位置的社交应用、打车软件,还是旅行导航、外送服务,地图定位技术都是不可或缺的一环。
本文将为大家介绍一些常见的地图定位技术,以帮助开发者们更好地使用地图定位功能。
一、使用GPS定位技术GPS(全球定位系统)是最常见的定位技术之一。
利用GPS芯片内置的定位模块,我们可以迅速获取用户的经纬度信息,并将其在地图上显示。
在Android开发中,可以通过Location Manager类获取GPS位置信息。
首先,需要在文件中添加相应的权限,在代码中注册位置监听器,并实现相关回调方法。
通过这种方法,我们可以实现实时跟踪用户的位置,并将其显示在地图上。
但需要注意的是,GPS定位需要用户开启定位服务、在室外环境下才能获得较好的定位精度。
二、利用Wi-Fi定位技术Wi-Fi定位技术是一种无线局域网定位技术,它通过扫描周围的Wi-Fi热点,并将其与预先记录的Wi-Fi信息进行匹配,来确定用户的位置。
相比于GPS定位技术,Wi-Fi定位技术更适用于室内环境和城市区域,在这些环境中,GPS信号相对较弱或不稳定。
在Android开发中,可以利用WifiManager类获取周围可用的Wi-Fi信息,并通过定位算法计算用户的位置。
但需要注意的是,Wi-Fi定位技术的精度相对较低,可能存在一定的误差。
三、使用基站定位技术基站定位技术是利用移动网络基站(电信基站、移动基站、联通基站)的信号强度和延迟等信息来确定用户的位置。
在无法获取GPS信号和Wi-Fi信号的情况下,基站定位技术可以作为一种备选方案。
在Android开发中,可以通过TelephonyManager类获取基站信息,并通过相应的算法计算用户的位置。
但需要注意的是,基站定位技术的精度相对较低,可能存在一定的误差。
四、结合多种技术实现更准确的定位在实际开发中,往往需要结合多种定位技术来获得更准确的定位结果。
Android6.0获取GPS定位和获取位置权限和位置信息的方法
Android6.0获取GPS定位和获取位置权限和位置信息的⽅法1.添加权限--6.0之后要动态获取,下⾯会说<uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"/>2.直接上代码,不多说,代码中注释很详细。
private static final int BAIDU_READ_PHONE_STATE = 100;//定位权限请求private static final int PRIVATE_CODE = 1315;//开启GPS权限/*** 检测GPS、位置权限是否开启*/public void showGPSContacts() {lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);if (ok) {//开了定位服务if (Build.VERSION.SDK_INT >= 23) { //判断是否为android6.0系统版本,如果是,需要动态添加权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PERMISSION_GRANTED) {// 没有权限,申请权限。
ActivityCompat.requestPermissions(this, LOCATIONGPS,BAIDU_READ_PHONE_STATE);} else {getLocation();//getLocation为定位⽅法}} else {getLocation();//getLocation为定位⽅法}} else {Toast.makeText(this, "系统检测到未开启GPS定位服务,请开启", Toast.LENGTH_SHORT).show();Intent intent = new Intent();intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivityForResult(intent, PRIVATE_CODE);}}/*** 获取具体位置的经纬度*/private void getLocation() {// 获取位置管理服务LocationManager locationManager;String serviceName = Context.LOCATION_SERVICE;locationManager = (LocationManager) this.getSystemService(serviceName);// 查找到服务信息Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE); // ⾼精度criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息/**这段代码不需要深究,是locationManager.getLastKnownLocation(provider)⾃动⽣成的,不加会出错**/if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED) { // TODO: Consider calling// ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置updateLocation(location);}/*** 获取到当前位置的经纬度* @param location*/private void updateLocation(Location location) {if (location != null) {double latitude = location.getLatitude();double longitude = location.getLongitude();LogUtil.e("维度:" + latitude + "\n经度" + longitude);} else {LogUtil.e("⽆法获取到位置信息");}}/*** Android6.0申请权限的回调⽅法*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {// requestCode即所声明的权限获取码,在checkSelfPermission时传⼊case BAIDU_READ_PHONE_STATE://如果⽤户取消,permissions可能为null.if (grantResults[0] == PERMISSION_GRANTED && grantResults.length > 0) { //有权限// 获取到权限,作相应处理getLocation();} else {showGPSContacts();}break;default:break;}}onRequestPermissionsResult 这个⽅法主要是动态获取6.0权限,返回时的回调,我这⾥需求是获取权限之后获取到当前位置的经纬度详细信息3.下⾯是当点击获取GPS定位,跳转到系统开关,ActivityResult回调,我这⾥做的是必须要开启GPS权限,没有开启会⼀直让⽤户开启权限,怎么决定,看具体需求@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case PRIVATE_CODE:showContacts();break;}}4.动态权限设置添加多条权限static final String[] LOCATIONGPS = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE};注:代码很详细!基础知识写的不好,⼤佬勿喷,谢谢!以上这篇Android6.0获取GPS定位和获取位置权限和位置信息的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Android_GPS如何获取经纬度
Android 如何获取经纬度移动是手机与手持设备的最大特点,可以通过Eclipse的DDMS视图,模拟设备的位置变化,改变经纬度后,点击send,然后运行程序,在应用程序中,动态的获取设备位置,然后显示当前的位置信息。
获取位置信息分为三步:1.添加系统权限,来支持对LBS硬件的访问Java代码:< uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">< /uses-permission>2.得到系统服务的LocationManager对象Java代码:LocationManager loctionManager;String contextService=Context.LOCATION_SERVICE;//通过系统服务,取得LocationManager对象loctionManager=(LocationManager) getSystemService(contextService);3. 得到位置提供器,通过位置提供器,得到位置信息,可以指定具体的位置提供器,也可以提供一个标准集合,让系统根据标准匹配最适合的位置提供器,位置信息是由位置提供其提供的。
a. 通过GPS位置提供器获得位置(指定具体的位置提供器)Java代码:String provider=LocationManager.GPS_PROVIDER;Location location = loctionManager.getLastKnownLocation(provider);b. 使用标准集合,让系统自动选择可用的最佳位置提供器,提供位置Java代码:Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度criteria.setAltitudeRequired(false);//不要求海拔criteria.setBearingRequired(false);//不要求方位criteria.setCostAllowed(true);//允许有花费criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗//从可用的位置提供器中,匹配以上标准的最佳提供器String provider = loctionManager.getBestProvider(criteria, true);//获得最后一次变化的位置Location location = loctionManager.getLastKnownLocation(provider);最后将位置信息显示在TextView中,如图:监听位置的变化//监听位置变化,2秒一次,距离10米以上Java代码:loctionManager.requestLocationUpdates(provider, 2000, 10, locationListener); //位置监听器private final LocationListener locationListener = new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}//当位置变化时触发@Overridepublic void onLocationChanged(Location location) {//使用新的location更新TextView显示updateWithNewLocation(location);}};。
Android客户端GPS定位源码
AndroidManifest.xml文件配置<?xml version="1.0"encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="cn.itcast.main"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon"android:label="@string/app_name"><activity android:name=".Main"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><categoryandroid:name="UNCHER"/></intent-filter></activity><uses-library android:name="com.google.android.maps"/> </application><uses-permission android:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permissionandroid:name="android.permission.ACCESS_FIND_LOCATION"/></manifest>Main.java文件package cn.itcast.main;import java.util.List;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Point;import android.location.Address;import android.location.Criteria;import android.location.Geocoder;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.view.MotionEvent;import android.widget.TextView;public class Main extends MapActivity{private MapController mapController;private GeoPoint geoPoint;private String msg;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);//获得mapviewMapView mapView=(MapView) this.findViewById(R.id.mapview);//地图的显示格式为交通图mapView.setTraffic(true);//设置可控mapView.setClickable(true);mapView.setEnabled(true);mapView.setBuiltInZoomControls(true);//得到gps设备的访问LocationManager locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);//设置gps定位配置Criteria criteria=new Criteria();//设置显示精度criteria.setAccuracy(Criteria.ACCURACY_COARSE);//是否获得海拔数据criteria.setAltitudeRequired(false);//是否获得方向数据criteria.setBearingRequired(false);//是否允许运营商计费criteria.setCostAllowed(true);//设置耗电程度criteria.setPowerRequirement(Criteria.POWER_LOW);//获得服务供应商String provider=locationManager.getBestProvider(criteria, true);//获取上一个定位点Locationlocation=locationManager.getLastKnownLocation(provider);//获得gps定位坐标信息Double latitude=location.getLatitude()*1E6;Double longitude=location.getLongitude()*1E6;//获得卫星定位点geoPoint=newGeoPoint(latitude.intValue(),longitude.intValue());//获得地图控制器mapController=mapView.getController();//设置地图显示初始化精度mapController.setZoom(12);mapController.animateTo(geoPoint);//实例化自定义绘图层MyOverlay myOverlay=new MyOverlay();//为mapview添加绘图层mapView.getOverlays().add(myOverlay);//定义一个final,TextView,以备子类引用final TextView textView=(TextView) findViewById(R.id.textview); LocationListener locationListener=new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {// TODO Auto-generated method stub}@Overridepublic void onProviderDisabled(String provider) {// TODO Auto-generated method stub}@Overridepublic void onLocationChanged(Location location) {Double latitude=location.getLatitude()*1E6;Double longitude=location.getLongitude()*1E6;try {//获得精度纬度字符串msg = "经度:" + location.getLongitude() + "\n";msg += "纬度:" + location.getLatitude() + "\n";//根据经纬度获得改点地址信息Geocoder gc=new Geocoder(Main.this);List<Address> addresses=gc.getFromLocation(latitude, longitude, 1);if (addresses.size()>0) {//获得地址信息msg+="AddressLine:"+addresses.get(0).getAddressLine(0)+"\n";//获得国家名msg += "CountryName:" +addresses.get(0).getCountryName()+"\n";msg+= "Locality:"+ addresses.get(0).getLocality() + "\n";msg += "FeatureName:" +addresses.get(0).getFeatureName();}textView.setText(msg);} catch (Exception e) {e.printStackTrace();}}};//注册位置监听器,1秒钟扫描1次locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);}class MyOverlay extends Overlay{//保证触控事件不重复操作p rivate int count=0;@Overridepublic boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when) {//定义画笔Paint paint=new Paint();paint.setColor(Color.RED);//定义屏幕点Point screenPoint=new Point();//gps点转屏幕点mapView.getProjection().toPixels(geoPoint, screenPoint);//获得gps标志点图片Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.flag);//绘制gps点图片canvas.drawBitmap(bitmap, screenPoint.x,screenPoint.y, paint);//绘制文字说明canvas.drawText("当前位置", screenPoint.x, screenPoint.y, paint);return super.draw(canvas, mapView, shadow, when);}@Overridepublic boolean onTouchEvent(MotionEvent e, MapView mapView) { //定义一个屏幕点Point screenPoint=new Point();//把gps点变成屏幕点mapView.getProjection().toPixels(geoPoint, screenPoint);//获得触点坐标int currentX=(int) e.getX();int currentY=(int) e.getY();//在50,30范围内触碰,显示当前经纬度if((currentX-screenPoint.x)>=0&&(currentX-screenPoint.x)<50&&(currentY-screenPoint.y>=0)&&(currentY-screenPoint.y)<30) {if (count==0) {new AlertDialog.Builder(Main.this).setMessage(msg).setPositiveButton("确定",new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {count=0;}}).show();}count++;}return super.onTouchEvent(e, mapView);}}@Overrideprotected boolean isRouteDisplayed() {// TODO Auto-generated method stubreturn false;}}注1:如果你的手机上没有gps定位系统,会有以下错误08-10 13:04:55.610: ERROR/AndroidRuntime(492): ng.RuntimeException: Unable to start activity ComponentInfo{cn.itcast.main/cn.itcast.main.Main}:ng.IllegalArgumentException: provider==null注2:记得去google官网/intl/zh-CN/android/maps-api-signup.html申请自己机器的apikeyC:\Documents and Settings\Administrator\.android>keytool -list -keystore debug.kEystore默认密码android我机器的apikey,你用不好使<com.google.android.maps.MapViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:apiKey="0EITsWoXq7NC_mgKW6yIxIViNLhMGsIW4dbmlsg />最终实现效果:随着android客户端得移动,在地图上提供精确的当前所在位置本编码和注释由刘国栋提供,祝大家编码顺利。
android手机GPS快速定位方法
论坛里有关这样的帖子不多,跑了很多冤枉路。
这不,跑了N天,用尽了坛子里及网上的大部分方法,终于可以秒定了自己的9108GPS了。
以前用的是IP3gs,越狱后,用的是高德地图,GPS那个叫快啊,现在入手9108,原来自带的上限导航觉得不好,pk掉了,但是装上凯*立德后,我靠竟然上星从2min-30min不等。都跑到海里去了,还没有定位那,郁闷啊。终于从网上找到一个确实好用的帖子。如果觉得自己的GPS好用的话,就走人,不要在这唧唧巴巴的。
XTRA_SERVER_3=http://xtra3.gpsonextra.n et/xtra.bin
SUPL_HOST=
SUPL_HOST=
SUPL_HOST=supl.c
SUPL_PORT=7276
# DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info
DEFAULT_USER_PLANE=TRUE
#########################################
##### GPS QUICKEST FIX V1.3 By RJLM #####
#########################################
################################
# FOR C2K PDE SUPPORT, set the following
# C2K_HOST= or IP
# C2K_PORT=1234
#################################
##### AGPS Carrier settings #####
安卓虚拟定位的原理
安卓虚拟定位的原理安卓虚拟定位是指通过软件技术改变设备上的位置信息,让设备展示一个虚假的位置。
这种技术被广泛应用于各种领域,包括游戏、导航、社交媒体等。
安卓虚拟定位的原理主要是通过模拟GPS信号来实现。
GPS(Global Positioning System)是一种全球卫星定位系统,通过接收卫星发射的信号来计算设备的准确位置。
在安卓系统中,定位功能主要是通过与GPS芯片进行交互来获取位置信息。
而对于虚拟定位,软件会通过与GPS芯片进行交互,并修改获取到的位置信息进行模拟。
具体操作上,软件会通过修改设备的GPS数据流来实现虚拟定位。
在接收到GPS数据之后,软件会将数据进行解析并修改,然后再将修改后的数据传递给应用程序。
这样,无论是使用导航软件、游戏应用,还是在社交媒体上发布位置信息,都会展示虚拟定位的位置而不是真实的位置。
为了实现虚拟定位,安卓系统需要进行一些操作。
首先,需要获取系统权限以修改定位数据流。
然后,软件将会对GPS数据进行修改,包括经纬度、高度、速度等信息。
最后,修改后的位置信息将被传递给相关应用程序,使其认为设备当前在虚拟定位的位置。
虚拟定位在各种场景中有不同的应用。
在游戏中,虚拟定位可以帮助玩家在游戏中改变自己的位置,从而获得游戏中的一些优势。
在导航领域,虚拟定位可以帮助用户避开拥堵路段或者规避危险区域。
在社交媒体上,虚拟定位可以让用户分享特定地点的照片或者状态,而不需要实际到达那个位置。
然而,虚拟定位也可能带来一些安全隐患。
有些人可能利用虚拟定位来进行恶意行为,例如在游戏中作弊,或者故意发布虚假的位置信息。
这些行为可能对其他用户或者系统造成不良影响。
总之,安卓虚拟定位利用GPS信号的模拟来改变设备的位置信息,从而实现虚假的定位效果。
虚拟定位在各种应用场景中有广泛的应用,但同时也需要注意安全隐患。
android gps 数据流程
Android GPS 数据流程分析概述:该文档将介绍android GPS 数据流程分析,在debug的时候可以做为数据流的捕捉的参考。
=============================================================在介绍数据流之前首先介绍的数据在hal层究竟从哪里来的,也就是原生的没经过解码的数据时从哪儿来的,首先进入到hardware下创建RPC通讯的地方开始,也就是创建一个RPC client,也就是loc_api_glue_init函数做这件事情:进入到loc_api_glue_init=> clnt_create:CLIENT *clnt_create(char * host,uint32 prog,uint32 vers,char * proto){…………………………………………………………….client->xdr = xdr_init_common(name, 1 /* client XDR */); …………………………………………………………………if (!num_clients++) {D("launching RX thread.\n");pthread_create(&rx_thread, NULL,rx_context, NULL);} else {/* client added, wake up rx_thread */if (write(wakeup_pipe[1], "a", 1) < 0)E("error writing to pipe\n");}……………………………………………………………………}NOTE:XDR是一个数据描述和数据编码的标准,它对于不同架构计算机之间的数据传输是非常有用的。
RPC是计算机之间的远过程调用协议。
Android通过原生方式获取经纬度与城市信息的方法
Android通过原⽣⽅式获取经纬度与城市信息的⽅法⼀、概述在项⽬中需要获取⽤户所在位置的经纬度和城市上送给风控系统。
⼀般来说,定位有两种⽅式:1. ⽤第三⽅SDK定位,如百度地图、⾼德地图、⾕歌地图;2. ⽤Android原⽣SDK中的api定位;本⽂讲述定位的第⼆种⽅式--⽤Android原⽣的SDK中的api定位,如果项⽬定位要求较⾼还是建议使⽤第三⽅地图库。
⼆、Android原⽣SDK中的api定位Android原⽣⽅式获取经纬度两种定位⽅式:GPS定位和Wifi定位GPS定位相⽐Wifi定位更精准且可在⽆⽹络情况下使⽤,但在室内基本暴毙⽆法使⽤。
WiFi定位没有室内外限制,也不需要开启GPS但需要联⽹。
但测试发现WiFi定位时onLocationChanged函数(⽤于监听经纬度变化)触发间隔⽆法⼩于30s。
⽰例代码如下:public class TestLocationActivity extends AppCompatActivity {public static final int LOCATION_CODE = 301;private LocationManager locationManager;private String locationProvider = null;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);getLocation();}private void getLocation(){//1.获取位置管理器locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);//2.获取位置提供器,GPS或是NetWorkList<String> providers = locationManager.getProviders(true);if (providers.contains(LocationManager.GPS_PROVIDER)) {//如果是GPSlocationProvider = LocationManager.GPS_PROVIDER;Log.v("TAG", "定位⽅式GPS");} else if (providers.contains(WORK_PROVIDER)) {//如果是NetworklocationProvider = WORK_PROVIDER;Log.v("TAG", "定位⽅式Network");}else {Toast.makeText(this, "没有可⽤的位置提供器", Toast.LENGTH_SHORT).show();return;}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限)if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED ||ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {//请求权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);} else {//3.获取上次的位置,⼀般第⼀次运⾏,此值为nullLocation location = locationManager.getLastKnownLocation(locationProvider);if (location!=null){Toast.makeText(this, location.getLongitude() + " " +location.getLatitude() + "",Toast.LENGTH_SHORT).show();Log.v("TAG", "获取上次的位置-经纬度:"+location.getLongitude()+" "+location.getLatitude());getAddress(location);}else{//监视地理位置变化,第⼆个和第三个参数分别为更新的最短时间minTime和最短距离minDistacelocationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener);}}} else {Location location = locationManager.getLastKnownLocation(locationProvider);if (location!=null){Toast.makeText(this, location.getLongitude() + " " +location.getLatitude() + "", Toast.LENGTH_SHORT).show();Log.v("TAG", "获取上次的位置-经纬度:"+location.getLongitude()+" "+location.getLatitude());getAddress(location);}else{//监视地理位置变化,第⼆个和第三个参数分别为更新的最短时间minTime和最短距离minDistacelocationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener);}}}public LocationListener locationListener = new LocationListener() {// Provider的状态在可⽤、暂时不可⽤和⽆服务三个状态直接切换时触发此函数@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}// Provider被enable时触发此函数,⽐如GPS被打开@Overridepublic void onProviderEnabled(String provider) {}// Provider被disable时触发此函数,⽐如GPS被关闭@Overridepublic void onProviderDisabled(String provider) {}//当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发@Overridepublic void onLocationChanged(Location location) {if (location != null) {//如果位置发⽣变化,重新显⽰地理位置经纬度Toast.makeText(TestLocationActivity.this, location.getLongitude() + " " +location.getLatitude() + "", Toast.LENGTH_SHORT).show();Log.v("TAG", "监视地理位置变化-经纬度:"+location.getLongitude()+" "+location.getLatitude());}}};@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) {case LOCATION_CODE:if(grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "申请权限", Toast.LENGTH_LONG).show();try {List<String> providers = locationManager.getProviders(true);if (providers.contains(WORK_PROVIDER)) {//如果是NetworklocationProvider = WORK_PROVIDER;}else if (providers.contains(LocationManager.GPS_PROVIDER)) {//如果是GPSlocationProvider = LocationManager.GPS_PROVIDER;}Location location = locationManager.getLastKnownLocation(locationProvider);if (location!=null){Toast.makeText(this, location.getLongitude() + " " +location.getLatitude() + "", Toast.LENGTH_SHORT).show();Log.v("TAG", "获取上次的位置-经纬度:"+location.getLongitude()+" "+location.getLatitude());}else{// 监视地理位置变化,第⼆个和第三个参数分别为更新的最短时间minTime和最短距离minDistacelocationManager.requestLocationUpdates(locationProvider, 0, 0,locationListener);}}catch (SecurityException e){e.printStackTrace();}} else {Toast.makeText(this, "缺少权限", Toast.LENGTH_LONG).show();finish();}break;}}//获取地址信息:城市、街道等信息private List<Address> getAddress(Location location) {List<Address> result = null;try {if (location != null) {Geocoder gc = new Geocoder(this, Locale.getDefault());result = gc.getFromLocation(location.getLatitude(),location.getLongitude(), 1);Toast.makeText(this, "获取地址信息:"+result.toString(), Toast.LENGTH_LONG).show();Log.v("TAG", "获取地址信息:"+result.toString());}} catch (Exception e) {e.printStackTrace();}return result;}@Overrideprotected void onDestroy() {super.onDestroy();locationManager.removeUpdates(locationListener);}}在AndroidManifest.xml加权限<!-- 粗略的位置权限 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 精确的位置权限 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><uses-permission android:name="android.permission.INTERNET"></uses-permission>三、总结⾸先将⼿机定位服务设置,调到下图所⽰:这可能会获取不到经纬度。
如何用手机获取精确经纬度
如何用手机获取精确经纬度1.使用手机自带的定位功能:现在大部分智能手机都内置了GPS(全球定位系统)芯片,可以通过手机自带的定位功能获取经纬度信息。
打开手机设置,找到“位置服务”或“定位”选项,确保定位功能已打开。
然后,在需要获取经纬度的应用程序中打开定位功能,等待一段时间,系统会自动获取当前位置的经纬度。
3.使用GPS定位器应用:除了地图应用外,还有一些专门用于定位的应用程序,如GPS定位器。
这类应用通常具有更多的定位功能,并且提供了更准确的经纬度信息。
例如,“GPS定位器”应用可以通过更加精准的GPS技术来获取当前位置的经纬度,用户只需打开应用并点击定位按钮,即可获取到当前位置的经纬度。
4.使用专用硬件:除了软件应用外,还有一些硬件设备可以用于获取精确的经纬度信息。
例如,一些专门的GPS设备可以与手机进行连接,通过这些设备可以获取更加准确的经纬度信息。
用户只需将这些设备与手机进行配对并打开相应的应用程序,就可以获取到当前位置的经纬度。
5.使用提供API的网站或应用程序:一些网站或应用程序提供了获取经纬度的API接口,用户可以通过这些接口获取到当前位置的经纬度信息。
例如,百度地图提供了通过API接口获取经纬度的功能,用户只需使用相应的请求方法,并带上所需的参数,即可获取到经纬度信息。
总之,用户可以通过手机自带的定位功能、第三方地图应用、GPS定位器应用、专用硬件设备以及提供API的网站或应用程序等多种方式来获取精确的经纬度信息。
用户只需根据自己的需求选择适合的方式,即可快速获取到所需的经纬度信息。
不过需要注意的是,由于各种应用和设备的精确度和可靠性不同,因此在获取经纬度信息时,建议使用多种方式进行验证,以确保获取的经纬度信息准确无误。
移动应用中GPS和地理位置服务的使用技巧
移动应用中GPS和地理位置服务的使用技巧随着智能手机的普及,移动应用中使用GPS和地理位置服务已经成为日常生活中的一部分。
这些功能不仅帮助我们在未知的城市中找到目的地,还可以提供周边服务和信息。
然而,要充分利用这些功能,我们需要了解一些使用技巧。
首先,我们需要打开手机的定位服务。
在大多数智能手机上,定位服务默认是关闭的,因此我们需要手动打开它们。
在Android设备中,可以在“设置”菜单下的“位置”选项中找到定位服务,然后将其打开。
在iOS设备中,我们可以在“设置”菜单中找到“隐私”选项,然后进入“定位服务”来启用它。
一旦定位服务开启,我们可以开始使用移动应用中的GPS和地理位置服务。
第一个技巧是使用地图导航功能。
无论是在城市间旅行还是在新的城市中探索,地图导航功能都可以帮助我们找到准确的路线。
我们可以在手机上使用内置应用的地图功能,也可以下载第三方导航应用,如谷歌地图或百度地图。
另一个使用技巧是利用周边服务。
很多应用都可以根据我们的地理位置提供当地的信息和服务。
比如,美团、大众点评和百度糯米等应用可以提供附近的餐厅、酒店和娱乐场所的信息。
我们只需要打开应用并授权定位服务,它们就会自动获取我们的地理位置,并展示附近的商家和优惠活动。
此外,移动应用中的GPS和地理位置服务还可以帮助我们管理时间和任务。
许多日历和提醒应用可以基于地理位置提醒我们预定的事项。
例如,我们可以设置在到达某个地点时,自动弹出相应的提醒通知。
这对于记得购买物品、参加会议或者完成任务非常有帮助。
在使用GPS和地理位置服务时,我们还需注意隐私和安全问题。
尽管这些功能方便,但泄露个人信息的风险也相对较高。
所以最好只在可信任的应用中允许定位权限,并定期检查应用的定位权限设置。
除了上述技巧,还有一些其他的有趣用法。
比如,我们可以下载星图应用来寻找和认识星座;或者下载植物识别应用,通过拍摄植物照片来获取它们的名字和特征;还可以使用移动应用中的AR技术来探索虚拟现实世界。
客户端开发教程:学会使用常见的位置定位技术(十)
在移动应用开发中,位置定位技术是一个非常重要的环节。
通过使用位置定位技术,我们可以为用户提供更加准确的服务,例如查找附近的餐馆、导航到目的地等。
本文将介绍一些常见的位置定位技术,并教你如何在客户端开发中使用它们。
1. GPS定位GPS(全球定位系统)是最常见和最常用的位置定位技术之一。
几乎所有智能手机都配备了GPS芯片,可以通过与卫星的通信来获取设备的地理位置信息。
在客户端开发中,我们可以使用手机操作系统提供的API来获取GPS定位信息。
首先,我们需要在文件中添加定位权限。
在``<manifest>``标签内添加以下代码:```<uses-permission android:name="_FINE_LOCATION" />```然后,我们可以在代码中使用LocationManager类来获取GPS定位信息。
以下是一个示例代码:```LocationManager locationManager = (LocationManager) getSystemService(_SERVICE);LocationListener locationListener = new MyLocationListener();(_PROVIDER, 0, 0, locationListener);```在上面的代码中,我们首先获取LocationManager对象,并创建一个实现LocationListener接口的自定义类MyLocationListener。
然后,我们使用requestLocationUpdates方法来注册位置更新监听器,其中GPS_PROVIDER参数表示我们要使用GPS定位。
在MyLocationListener类中,我们可以实现onLocationChanged方法来处理位置更新事件。
例如,我们可以在该方法中获取到最新的经纬度信息:```public void onLocationChanged(Location location) {double latitude = ();double longitude = ();// 处理经纬度信息}```通过上述步骤,我们就可以在客户端应用中使用GPS定位技术了。
几种获取当前地理位置信息的方法
几种获取当前地理位置信息的方法获取当前地理位置信息是一种常见且有实际应用的需求。
本文将介绍几种获取当前地理位置信息的方法,包括使用GPS定位、使用WiFi定位、使用基站定位、使用IP定位和使用传感器定位等几种常见的方法。
一、GPS定位GPS定位是一种通过卫星定位系统确定地理位置的方法。
现代智能手机中都内置了GPS芯片,可以通过访问该芯片获取当前地理位置信息。
GPS定位的原理是通过接收来自多颗卫星的信号并计算其与手机之间的距离,再通过三边测量的方法确定手机的精确位置。
GPS定位的精度相对较高,在户外环境下可以达到几米甚至更小的范围。
但在室内环境或高楼大厦附近等复杂环境下,GPS信号可能受到干扰导致定位不准确。
二、WiFi定位WiFi定位是一种通过手机接入的WiFi网络来确定地理位置的方法。
WiFi定位的原理是通过手机扫描周围的WiFi信号,获取到一些已知位置的WiFi热点的位置信息,然后根据手机与这些热点之间的信号强度和距离来进行定位计算。
WiFi定位的精度较高,可以达到几十米的范围,但依赖于已知位置的WiFi热点信息,所以在一些偏远地区或新建地区可能无法提供准确的定位结果。
三、基站定位基站定位是一种通过手机与周围基站之间的信号交互来确定地理位置的方法。
基站定位的原理是手机与周围的基站进行通信,基站会记录手机与其之间的信号强度,并将这些信息发送给位置服务器进行计算。
通过计算手机与多个基站之间的信号强度和距离,可以确定手机的位置。
基站定位相对于GPS定位和WiFi定位来说,精度较差,通常在几百米到几千米的范围内。
四、IP定位IP定位是一种通过IP地址来确定地理位置的方法。
每个手机或电脑在连接互联网时都会被分配一个独立的IP地址,而IP地址通常与地理位置有一定的关联。
IP定位的原理是通过查询IP地址与位置信息的映射关系数据库,将IP地址对应的地理位置信息返回给用户。
IP定位的精度相对较差,通常在几十到几百公里的范围内。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原文地址:Android成功使用GPS获取当前地理位置(解决getLastKnownLocation返回null)作者:这个十年这两天可憋坏我了,一直愁没什么题材可以充实我的博客,正巧最近遇到一个比较棘手的问题:使用GPS定位无法获取当前的地理位置,即getLastKnownLocation方法始终返回null。
后来一篇博文getLastKnownLocation()返回null的解决帮了我大忙,在此对该博客作者表示感谢,但是有几点需要注意的,我觉得有必要补充一下,否则看了这篇博文也还是得不到当前的地理位置。
第一:当使用GPS定位时,最好不要使用getLastKnownLocation方法获得当前位置对象Location,因为该对象可以在onLocationChanged 的参数中由系统给予(根据文档,getLastKnownLocation有2方面功能:1. 获取当前地理位置 2.如果当前位置定位不成功,则可以用此方法获取缓存中的上一次打开地图时定位的地理位置)。
这样就避免了空指针异常。
而且更重要的是GPS定位不是一下子就能定位成功的,在90%以上的情况下,getLastKnownLocation返回null第二:LocationListener 最好在Activity的onCreate()方法中进行实例化实现系统的回调方法:onLocationChanged(final Location loc)onProviderDisabled(final String s)onProviderEnabled(final String s)onStatusChanged(final String s, final int i, final Bundle b)第三:requestLocationUpdates 必须要在onResume()中进行注册监听. 且在onPause()中进行反注册。
第四:测试GPS是否定位成功,去一个空旷的地方去,不要有遮挡。
这点非常重要,不然,你永远也不知道自己GPS定位是否成功。
以下是我用GPS成功获取当前地理位置的例子。
希望能够帮助大家摆脱GPS定位的阴霾。
@Overridepublic void onCreate(final Bundle icicle) {super.onCreate(icicle);this.setContentView(yout.activity_mapview);mBtnDone =(Button) findViewById(R.id.btn_done);mBtnDone.setOnClickListener(this);mapView = (MapView) findViewById(R.id.map_view);mapView.setBuiltInZoomControls(true);mapController = mapView.getController();mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);mDefaultMarker =getResources().getDrawable(R.drawable.map_redpin);mDefaultMarker.setBounds(0, 0,mDefaultMarker.getIntrinsicWidth(),mDefaultMarker.getIntrinsicHeight());mBuoyOverlay = new BuoyItemizedOverlay(mDefaultMarker, this);initDensityDpi();mZoomLevel = mapView.getMaxZoomLevel() - 1;//LocationListener 最好在Activity的onCreate()方法中进行实例化,当GPS获得Location时,会自动调用onLocationChanged方法.mLocationListener = new LocationListener() {@Overridepublic void onLocationChanged(final Location loc) {LogHelper.i(TAG, "onLocationChanged. loc: " + loc);if (loc != null) {LogHelper.i(TAG, "onLocationChanged. latitude: "+ loc.getLatitude() + " , longtitude:".getLongitude());GeoPoint geoPoint = MapUtils.getGeoPoint(loc);mapController.animateTo(geoPoint);initBuoyOverlayItems(loc);} else {Toast(MapViewActivity.this,"Your current location is temporarily unavailable.",Toast.LENGTH_SHORT).show();}}// 当系统Setting -> Location & Security -> Use wireless networks取消勾选,Use GPS satellites取消勾选时调用public void onProviderDisabled(final String s) {LogHelper.i(TAG, "onProviderDisabled. ");}// 当系统Setting -> Location & Security -> Use wireless networks勾选,Use GPS satellites勾选时调用public void onProviderEnabled(final String s) {LogHelper.i(TAG, "onProviderEnabled. ");}public void onStatusChanged(final String s, final int i, final Bundle b) {LogHelper.i(TAG, "onStatusChanged. ");}};}@Overridepublic void onStart() {super.onStart();mapController.setZoom(mZoomLevel);if (!DoSomeGoodUtils.isNetworkAvailable(this)) {mBtnDone.setEnabled(false);showDialog(DIALOG_NO_NETWORK);} else {// 判断Use GPS satellites.是否勾选boolean isGpsEnabled =MapUtils.isGPSProviderAvaliable(this);// 判断Use wireless networks 是否勾选boolean isWIFIEnabled =MapUtils.isWIFIProviderAvaliable(this);if (!isGpsEnabled && !isWIFIEnabled) {如果都没有勾选,则弹出对话框,提示用户勾选。
}else {Location lastKnownLocation = null;// 如果只是Use GPS satellites勾选,即指允许使用GPS定位if (isGpsEnabled && !isWIFIEnabled) {lastKnownLocation=mLocationManager.getLastKnown Location(LocationManager.GPS_PROVIDER);mProviderName = LocationManager.GPS_PROVIDER;// 如果只是Use wireless networks勾选,即只允许使用网络定位。
} else if(!isGpsEnabled && isWIFIEnabled){lastKnownLocation= mLocationManager.getLastKnownLocation( WORK_PROVIDER);mProviderName =WORK_PROVIDER;// 如果二者都勾选,优先使用GPS,因为GPS定位更精确。
} else if (isGpsEnabled && isWIFIEnabled){ lastKnownLocation=mLocationManager.getLastKnownLoca tion(LocationManager.GPS_PROVIDER);mProviderName = LocationManager.GPS_PROVIDER;if (lastKnownLocation == null) {lastKnownLocation=mLocationManager.getLastKnownLocation(WOR K_PROVIDER);mProviderName = WORK_PROVIDER;}}if (!TextUtils.isEmpty(mProviderName)) {mLocationManager.requestLocationUpdates(mProviderName, 1000, 1, mLocationListener);}// 如果一下子就能定位成功,则执行以下代码,当用网络定位时,大都能一次性定位成功,当用GPS时,该代码不会起太大作用。
if (lastKnownLocation != null) {mBtnDone.setEnabled(true);// 获取当前地理位置GeoPoint lastKnownPoint =getLastKnownPoint(lastKnownLocation);// 以动画方式移动到该地理位置mapController.animateTo(lastKnownPoint);// 更新浮标。
该方法在这里就不公开了。
知道它的含义就行initBuoyOverlayItems(lastKnownLocation);}}}}@Overrideprotected void onResume() {super.onResume();LogHelper.i(TAG, "onResume. Provider Name: " + mProviderName);if (!TextUtils.isEmpty(mProviderName)) {// 当GPS定位时,在这里注册requestLocationUpdates监听就非常重要而且必要。