當前位置:首頁 » 安卓系統 » 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-04-30 06:12:24 瀏覽:358
浪潮伺服器root怎麼設置 發布:2024-04-30 06:06:01 瀏覽:214
超凡先鋒哪裡密碼門 發布:2024-04-30 06:01:50 瀏覽:317
安卓手機賬號如何登錄 發布:2024-04-30 05:48:35 瀏覽:289
python參數不定 發布:2024-04-30 05:47:20 瀏覽:675
空氣壓縮機油dab150 發布:2024-04-30 05:45:51 瀏覽:678
資料庫通識 發布:2024-04-30 05:45:50 瀏覽:459
shell運行腳本 發布:2024-04-30 05:27:19 瀏覽:332
glsl用什麼編譯 發布:2024-04-30 05:17:47 瀏覽:825
領克05如何選配置 發布:2024-04-30 04:37:23 瀏覽:430