当前位置:首页 » 安卓系统 » androidgps监听

androidgps监听

发布时间: 2022-08-02 16:54:53

❶ 导航里面的gps监听是什么意思呢

gps是全球定位系统的英文缩写,就是能利用卫星确定你在地球上的位置,不过这个位置使用经纬度来表示,也就是两串数字,不和地图配合还是不能确定自己的位置,没有意义。现在车上的gps导航系统,内置地图,根据确定的经纬度,把当前的位置显示在地图上,开车的时候就不会迷路了。
第二,你可以设定目的地,系统会通过画面和语音的行驶,告诉你路口应该怎么转,引导你到达目的地。你可以选择最短路线,不走高速等。
第三,gps导航系统可以提示你超速摄像头、闯红灯摄像头的位置,超速或行驶到路口的时候提醒你,避免罚款。
第四,现在有的导航系统把实时交通信息整合进来,哪里一路畅通,哪里拥堵,它可以提示你选择合适的路线。

❷ android.location.Location 定位实例化

一、LocationManager
LocationMangager,位置管理器。要想操作定位相关设备,必须先定义个LocationManager。我们可以通过如下代码创建LocationManger对象。
LocationManger locationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

二、LocationListener
LocationListener,位置监听,监听位置变化,监听设备开关与状态。

private LocationListener locationListener=new LocationListener() {

/**
* 位置信息变化时触发
*/
public void onLocationChanged(Location location) {
updateView(location);
Log.i(TAG, "时间:"+location.getTime());
Log.i(TAG, "经度:"+location.getLongitude());
Log.i(TAG, "纬度:"+location.getLatitude());
Log.i(TAG, "海拔:"+location.getAltitude());
}

/**
* GPS状态变化时触发
*/
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
//GPS状态为可见时
case LocationProvider.AVAILABLE:
Log.i(TAG, "当前GPS状态为可见状态");
break;
//GPS状态为服务区外时
case LocationProvider.OUT_OF_SERVICE:
Log.i(TAG, "当前GPS状态为服务区外状态");
break;
//GPS状态为暂停服务时
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.i(TAG, "当前GPS状态为暂停服务状态");
break;
}
}

/**
* GPS开启时触发
*/
public void onProviderEnabled(String provider) {
Location location=lm.getLastKnownLocation(provider);
updateView(location);
}

/**
* GPS禁用时触发
*/
public void onProviderDisabled(String provider) {
updateView(null);
}

};

三、Location
Location,位置信息,通过Location可以获取时间、经纬度、海拔等位置信息。上面采用locationListener里面的onLocationChanged()来获取location,下面讲述如何主动获取location。
Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
system.out.println("时间:"+location.getTime());
system.out.println("经度:"+location.getLongitude());
注意:Location location=new Location(LocationManager.GPS_PROVIDER)方式获取的location的各个参数值都是为0。

四、GpsStatus.Listener
GpsStatus.Listener ,GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。

//状态监听
GpsStatus.Listener listener = new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) {
switch (event) {
//第一次定位
case GpsStatus.GPS_EVENT_FIRST_FIX:
Log.i(TAG, "第一次定位");
break;
//卫星状态改变
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
Log.i(TAG, "卫星状态改变");
//获取当前状态
GpsStatus gpsStatus=lm.getGpsStatus(null);
//获取卫星颗数的默认最大值
int maxSatellites = gpsStatus.getMaxSatellites();
//创建一个迭代器保存所有卫星
Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator();
int count = 0;
while (iters.hasNext() && count <= maxSatellites) {
GpsSatellite s = iters.next();
count++;
}
System.out.println("搜索到:"+count+"颗卫星");
break;
//定位启动
case GpsStatus.GPS_EVENT_STARTED:
Log.i(TAG, "定位启动");
break;
//定位结束
case GpsStatus.GPS_EVENT_STOPPED:
Log.i(TAG, "定位结束");
break;
}
};
};
//绑定监听状态
lm.addGpsStatusListener(listener);

五、GpsStatus

GpsStatus,GPS状态信息,上面在卫星状态变化时,我们就用到了GpsStatus。

//实例化
GpsStatus gpsStatus = locationManager.getGpsStatus(null); // 获取当前状态
//获取默认最大卫星数
int maxSatellites = gpsStatus.getMaxSatellites();
//获取第一次定位时间(启动到第一次定位)
int costTime=gpsStatus.getTimeToFirstFix();
//获取卫星
Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();
//一般再次转换成Iterator
Iterator<GpsSatellite> itrator=iterable.iterator();

六、GpsSatellite

GpsSatellite,定位卫星,包含卫星的方位、高度、伪随机噪声码、信噪比等信息。

//获取卫星
Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();
//再次转换成Iterator
Iterator<GpsSatellite> itrator=iterable.iterator();
//通过遍历重新整理为ArrayList
ArrayList<GpsSatellite> satelliteList=new ArrayList<GpsSatellite>();
int count=0;
int maxSatellites=gpsStatus.getMaxSatellites();
while (itrator.hasNext() && count <= maxSatellites) {
GpsSatellite satellite = itrator.next();
satelliteList.add(satellite);
count++;
}
System.out.println("总共搜索到"+count+"颗卫星");
//输出卫星信息
for(int i=0;i<satelliteList.size();i++){
//卫星的方位角,浮点型数据
System.out.println(satelliteList.get(i).getAzimuth());
//卫星的高度,浮点型数据
System.out.println(satelliteList.get(i).getElevation());
//卫星的伪随机噪声码,整形数据
System.out.println(satelliteList.get(i).getPrn());
//卫星的信噪比,浮点型数据
System.out.println(satelliteList.get(i).getSnr());
//卫星是否有年历表,布尔型数据
System.out.println(satelliteList.get(i).hasAlmanac());
//卫星是否有星历表,布尔型数据
System.out.println(satelliteList.get(i).hasEphemeris());
//卫星是否被用于近期的GPS修正计算
System.out.println(satelliteList.get(i).hasAlmanac());
}

为了便于理解,接下来模拟一个案例,如何在程序代码中使用GPS获取位置信息。
第一步:新建一个Android工程项目,命名为mygps,目录结构如下

第二步:修改main.xml布局文件,修改内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cursorVisible="false"
android:editable="false"
android:id="@+id/editText"/>
</LinearLayout>

第三步:实用Adnroid平台的GPS设备,需要添加上权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

第四步:修改核心组件activity,修改内容如下

package com.ljq.activity;

import java.util.Iterator;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;

public class GpsActivity extends Activity {
private EditText editText;
private LocationManager lm;
private static final String TAG="GpsActivity"; @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
lm.removeUpdates(locationListener);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

editText=(EditText)findViewById(R.id.editText);
lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);

//判断GPS是否正常启动
if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Toast.makeText(this, "请开启GPS导航...", Toast.LENGTH_SHORT).show();
//返回开启GPS导航设置界面
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent,0);
return;
}

//为获取地理位置信息时设置查询条件
String bestProvider = lm.getBestProvider(getCriteria(), true);
//获取位置信息
//如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER
Location location= lm.getLastKnownLocation(bestProvider);
updateView(location);
//监听状态
lm.addGpsStatusListener(listener);
//绑定监听,有4个参数
//参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
//参数2,位置信息更新周期,单位毫秒
//参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
//参数4,监听
//备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新

// 1秒更新一次,或最小位移变化超过1米更新一次;
//注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);
}

//位置监听
private LocationListener locationListener=new LocationListener() {

/**
* 位置信息变化时触发
*/
public void onLocationChanged(Location location) {
updateView(location);
Log.i(TAG, "时间:"+location.getTime());
Log.i(TAG, "经度:"+location.getLongitude());
Log.i(TAG, "纬度:"+location.getLatitude());
Log.i(TAG, "海拔:"+location.getAltitude());
}

/**
* GPS状态变化时触发
*/
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
//GPS状态为可见时
case LocationProvider.AVAILABLE:
Log.i(TAG, "当前GPS状态为可见状态");
break;
//GPS状态为服务区外时
case LocationProvider.OUT_OF_SERVICE:
Log.i(TAG, "当前GPS状态为服务区外状态");
break;
//GPS状态为暂停服务时
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.i(TAG, "当前GPS状态为暂停服务状态");
break;
}
}

/**
* GPS开启时触发
*/
public void onProviderEnabled(String provider) {
Location location=lm.getLastKnownLocation(provider);
updateView(location);
}

/**
* GPS禁用时触发
*/
public void onProviderDisabled(String provider) {
updateView(null);
}

};

❸ android gps是怎么定位的

开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络中现有对于介绍android定位的几种方式,希望对大家有帮助:
android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,
(1) Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了)。通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电;2,绝大部分用户默认不开启GPS模块;3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;4,室内几乎无法使用。这其中,缺点2,3都是比较致命的。需要指出的是,GPS走的是卫星通信的通道,在没有网络连接的情况下也能用。要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:
uses-permission android:name= android.permission.ACCESS_FINE_LOCATION /uses-permission

❹ 如何刷新Android手机的GPS状态

locationManager = (LocationManager)LocationActivity.this.getSystemService(Context.LOCATION_SERVICE);
locationManager.addGpsStatusListener(statusListener);
/**
* 卫星状态监听器
*/
private List<GpsSatellite> numSatelliteList = new ArrayList<GpsSatellite>(); // 卫星信号
private final GpsStatus.Listener statusListener = new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) { // GPS状态变化时的回调,如卫星数
LocationManager locationManager = (LocationManager) LocationActivity.this.getSystemService(Context.LOCATION_SERVICE);
GpsStatus status = locationManager.getGpsStatus(null); //取当前状态
String satelliteInfo = updateGpsStatus(event, status);
if("".equals(satelliteInfo)){
Toast.makeText(LocationActivity.this, "GPS works bad !", Toast.LENGTH_LONG).show();
isGpsEnable=false;
}
}
};
private String updateGpsStatus(int event, GpsStatus status) {
StringBuilder sb2 = new StringBuilder("");
if (status == null) {
sb2.append("搜索到卫星个数:" +0);
} else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
int maxSatellites = status.getMaxSatellites();
Iterator<GpsSatellite> it = status.getSatellites().iterator();
numSatelliteList.clear();
int count = 0;
while (it.hasNext() && count <= maxSatellites) {
GpsSatellite s = it.next();
numSatelliteList.add(s);
count++;
}
sb2.append("搜索到卫星个数:" + numSatelliteList.size());
}

return sb2.toString();
}

❺ Android 怎样稳定的获取原生GPS数据

定位了就有经纬度,没定位,则一直闪的;
一般是4个星的时候 会定位。
所以可以根据是否获取有效的经纬度信息来判断是否定位。

卫星的个数 sv_status也是可以通过API获取的。LOCATION类
给一段咱的代码,看看就知道了。

locationManager.addGpsStatusListener(statusListener);//侦听GPS状态

private GpsStatus.Listener statusListener = new GpsStatus.Listener()

{

public void onGpsStatusChanged(int event)

{

// TODO Auto-generated method stub

GpsStatus gpsStatus= locationManager.getGpsStatus(null);

Log.v(TAG,"GPS status listener ");

//Utils.DisplayToastShort(GPSService.this, "GPS status listener ");

switch(event)

{

case GpsStatus.GPS_EVENT_FIRST_FIX:{

//第一次定位时间UTC gps可用

//Log.v(TAG,"GPS is usable");

int i=gpsStatus.getTimeToFirstFix();

Utils.DisplayToastShort(GPSService.this, "GPS 第一次可用 "+i);

Utils.setGPSStatus(Utils.GPS_STATUS.START);

break;

}

case GpsStatus.GPS_EVENT_SATELLITE_STATUS:{//周期的报告卫星状态

//得到所有收到的卫星的信息,包括 卫星的高度角、方位角、信噪比、和伪随机号(及卫星编号)

Iterable<GpsSatellite> allSatellites;

allSatellites = gpsStatus.getSatellites();

Iterator<GpsSatellite>iterator = allSatellites.iterator();

int numOfSatellites = 0;

int maxSatellites=gpsStatus.getMaxSatellites();

while(iterator.hasNext() && numOfSatellites<maxSatellites){

numOfSatellites++;

iterator.next();

}

Log.v(TAG,"GPS is **unusable** "+ numOfSatellites +" "+ maxSatellites);

if( numOfSatellites < 3){

// Utils.DisplayToastShort(GPSService.this, "***卫星少于3颗***");

Utils.setGPSStatus(Utils.GPS_STATUS.STOP);

} else if(numOfSatellites > 7){

Utils.setGPSStatus(Utils.GPS_STATUS.START);

}

break;

}

case GpsStatus.GPS_EVENT_STARTED:{

//Utils.DisplayToastShort(GPSService.this, "GPS start Event");

break;

}

case GpsStatus.GPS_EVENT_STOPPED:{

//Utils.DisplayToastShort(GPSService.this, "GPS **stop*** Event");

Utils.setGPSStatus(Utils.GPS_STATUS.STOP);

break;

}

default :

break;

}

}

};

❻ android studio-android 怎么实现实时GPS监控

这个就是给你个思路,定位后,得到经纬度,然后不断的进行定位,有了每次定位的时间间隔,有了经纬度数,你说怎么算呢?先了解一下,每一度相对应的距离,每每一秒,是多少米,相对的来算就行了

❼ android 自身GPS定位问题,求原因

楼主遇到的情况是电子地图的正常功能,原因是电子地图都有定位缓冲。地图打开时总要显示一个区域,如果定位了当然应该显示当前区域,如果不能定位,就显示最后一次定位的区域。
另外,手机在室内也并非不能定位,如果手机接入了互联网,不管是WIFI还是GPRS,都可以通过移动通信基站或网络IP进行概略定位,而且这种定位方式正呈现日益精确的趋势,有时甚至也可以精确到几十米范围内。

❽ android GPS开发:真机试验获取不到坐标点

GPS去室外接收,室内GPS信号非常差,有些角落完全收不到,所以你要测试GPS功能的话去室外。

❾ android 如何实现千分位

基于android的定位无非就两种:network、gps。两者各有优劣。
Network:定位快,准确度低,受环境影响小。
GPS:定位慢,准确度高,受环境影响大。

本文要解决的问题:
1. locationManager.getLastKnownLocation方法返回null。
2. 如何实现快速而又精确的定位。

E文好的话,直接看官网就好了http://developer.android.com/guide/topics/location/strategies.html

在你的程序里如果有这样的代码你就要注意了(现在看来这些倒是多余了)

[java] view plain
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);
locationManager.getLastKnownLocation(provider);

locationManager.getBestProvider(criteria,true);方法看起来很完美,但其实返回值就network、gps二选一。而且如果你要求高精度,它会优先检查GPS,如果手机开启了GPS就返回GPS,否则返回network。如果都没开启则返回null。
结合Network、GPS两种定位方式的优劣不难看出为什么getLastKnownLocation方法会返回null(这只针对第一次定位)。

当你开启GPS,provider的值为GPS。这时的定位方式为GPS,由于GPS定位慢(我测试的时间大约为50秒),所以它不可能立即返回你一个Location对象,所以就返回null了。还有人用下面的方法解决这个问题:

[java] view plain
while (location ==null) {
location = locationManager.getLastKnownLocation(provider);
}

这绝对是个愚蠢的做法!举个例子:如果你在室内,gps无法定位到,你的程序将陷入死循环。当然使用requestLocationUpdates可以做到定位且不让程序陷入死循环,但是定位耗时长,甚至得不到定位。
如果使用网络定位呢,不得说这也是一个不错的选择。locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0,networkListener);
网络定位耗时一般在2秒左右(网络差,时间会更长),只要你接入网络,基本上都能获得定位。唯一的缺点就是精度不高。

那能不能将两者结合,这也是本文的重点。既然结合两者,就要同时为两者添加监听

[java] view plain
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000 * 2,50,gpsListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,networkListener);

这样,大概2秒我们就可以得到来自网络的定位,一分钟后得到来自GPS定位。这时用GPS定位替换网络定位就好了。当然这只是个理想的情况,现实要复杂的多。
比如:
你第一次定位成功返回location,由于网络问题第二次返回null。这时会发现,更新的location没有上次的精确,甚至是null,无法使用,这时我们要判断当前的location和新获得的location那个更好。可能你获得GPS定位后,由于天气、进入隧道等原因GPS服务器丢失,无法更新location(这时一个好的做法是切换到network定位)。还有可能用户没有开启GPS和network,根本就谈不上定位(其实每次定位成功都会有个定位缓存的,可以使用getLastKnownLocation获得)。

终上所述,我们要做的就是:
1. 尝试通过getLastKnownLocation获取上次定位信息
2. 开启network和gps监听
3. 获得network定位信息location
4. 比较当前location和新获取的location哪个更好(来自network)
5. 获得gps定位信息location
6. 停掉network监听
7. 比较当前location和新获取的location哪个更好(来自gps)
8. 如果gps服务器丢失,重新开启network监听

以GPS监听为例
[java] view plain
// GPS监听的回调函数
private class GPSLocationListener implements LocationListener {

private boolean isRemove = false;//判断网络监听是否移除

@Override
public void onLocationChanged(Location location) {
// TODO Auto-generatedmethod stub
boolean flag =betterLocation.isBetterLocation(location,
currentBestLocation);

if (flag) {
currentBestLocation = location;
updateLocation(currentBestLocation);
}
// 获得GPS服务后,移除network监听
if (location !=null && !isRemove) {
locationManager.removeUpdates(networkListener);
isRemove = true;
}
}

@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generatedmethod stub
}

@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generatedmethod stub
}

@Override
public void onStatusChanged(String provider, int status, Bundleextras) {
// TODO Auto-generatedmethod stub
if (LocationProvider.OUT_OF_SERVICE == status) {
Toast.makeText(MainActivity.this,"GPS服务丢失,切换至网络定位",
Toast.LENGTH_SHORT).show();
locationManager
.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0,
networkListener);
}

❿ android开发时间同步求教 如果监听用户设置系统时间。并强制系统时间与网络或者GPS时间同步。

其实,不管用户如何设置,GPS一同步,就更新系统时间了。————前提是你的程序在该机中运行着、GPS开着并有信号

热点内容
查询账单初始密码是多少 发布:2024-05-17 06:58:45 浏览:650
反编译封挂 发布:2024-05-17 06:17:42 浏览:820
台电怎么从电脑转至安卓 发布:2024-05-17 06:07:23 浏览:436
我的世界国际版服务器里如何开挂 发布:2024-05-17 06:06:05 浏览:873
如何同步各个服务器时间 发布:2024-05-17 06:00:19 浏览:714
上课用平板是什么配置 发布:2024-05-17 05:29:51 浏览:565
linux指定组 发布:2024-05-17 05:04:39 浏览:86
鲁班算法 发布:2024-05-17 04:59:46 浏览:489
分布钢筋配置有哪些 发布:2024-05-17 04:51:57 浏览:148
轩逸宝来朗逸配置一样哪个平易 发布:2024-05-17 04:48:59 浏览:433