日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GPS用户定位

發布時間:2024/1/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GPS用户定位 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習內容

??GPS的概念和用途

??LocationManagerLocationProvider

??LocationListener

能力目標

??掌握GPS的概念和用途

??掌握如何利用DDMS模擬定位

??Android中如何獲取全部及指定的LocationProvider

??掌握如何獲取用戶的位置


本章簡介

現在的手機大多數都提供了GPS模塊、通過GPS模塊可以接收GPS信號,并可精確地指定目前所在的位置,如果將GPS定位功能應用到地圖上,還可以實現導航、搜索公交、搜索駕車路線等實用且有趣功能。本章中我們先學習GPS的基本知識,然后通過具體的案例講解Android環境中GPS開發的基本原理及步驟。學習過本章知識之后我們能夠利用GPS進行簡單的定位功能的開發。學習本章的重點是掌握LocationManagerLocationProviderLocationListenerAPI的功能和用法,并可以通過它們來監聽、獲取GPS定位信息。

??

核心技能部分

9.1?GPS簡介

全球定位系統GPS的全稱是Global Positioning System,它是20世紀70年代由美國陸海空三軍聯合研制的新一代空間衛星導航定位系統。GPS的作用就是在全球范圍內提供提供準確的定位、測量、和高精度的時間標準等功能。

GPS定位系統由三部分組成:GPS衛星組成的空間部分,若干地面站組成的控制部分和普通用戶手機中的接收器。對于手機用戶來說,手機就是GPS定位系統的接收器,也就是說GPS定位需要手機的硬件支持GPS功能。

GPS是一個中距離圓形軌道衛星導航系統,該系統包括太空中分布在傾角為55度的6個軌道上的24GPS衛星、地面上的一個主控站、3個數據注入站和5個監測站以及作為用戶端的GPS接收器。最少只需要其中的3顆衛星,就能迅速確定用戶端在地球上所處的位置及海拔坐標,所能接收到的衛星數越多,解碼出來的數據就越精確。

GPS定位系統聽上去專業、高深,是一門非常高深的技術,但對于Android應用開發的程序員來說,開發提供GPS功能的應用程序十分簡單。就像Android為電話管理支持提供了TelephonyManager類、為音頻管理支持提供了AudioManager類一樣,AndroidGPS提供了LocationManager類,通過LocationManager類及其他幾個輔助類,我們可以非常方便地開發出功能強大的GPS應用。

?

9.2?獲取LocationProvider

Android中進行GPS開發,需要涉及LocationManagerLocationProviderLocation三個類。

LocationManager類的作用與TelephonyManagerAudioManager等服務類的作用相似,所有GPS定位相關的服務、對象都將由該對象來產生。與程序中獲取TelephonyManagerAudioManager的方法相似 ,程序中獲取LocationManager的實例是通過調用ContextgetSystemService()方法來獲取,如下代碼所示:

LocationManager lm = getSystemServiceContext.LOCATION_SERVICE;

一旦在程序中獲得了LocationManager對象之后,接下來即可調用LocationManager的方法來獲取GPS定位的相關服務和對象。

定位提供者LocationProviderGPS定位組件的抽象表示,Android的定位信息就是由它提供的,即,通過LocationProvider類的方法可以獲取定位組件的相關信息。

Location是位置信息的抽象類,它提供了大量用來獲取定位信息的方法。

上面三個類就是Android GPS支持的三個核心API,使用它們獲取GPS定位信息的通用步驟為:

(1)?獲取系統的LocationManager對象。

(2)?使用LocationManager,通過指定LocationProvider來獲取定位信息,定位信息由Location對象來表示。

(3)?Location對象中獲取定位信息。

?

示例9.1

獲取LocationProvider

通過前面的介紹可以看出,Android的定位信息由LocationProvider對象提供的,因此在開始編程之前,需要先獲取LocationProvider對象。LocationManager提供了一個getAllProviders()方法,該方法可以用來獲取系統所有可用的LocationProvider

在布局文件中我們使用一個idlistListView組件,用來顯示所有LocationProvider

Activity類的代碼如下:

public?class?GetAllProvidersActivity extends?Activity {

private?ListView listView?= null;

private?LocationManager manager?= null;

?

@Override

public?void?onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.providers);

listView?= (ListView) findViewById(R.id.list);

// 獲取系統的LocationManager對象

manager?= (LocationManager) getSystemService(Context.LOCATION_SERVICE);

// 獲取系統所有的LocationProvider的名稱

List<String> providerNames = manager.getAllProviders();

ArrayAdapter<String> adapter =

new?ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1,

?providerNames);

// 使用ListView來顯示所有可用的LocationProvider

listView.setAdapter(adapter);

}

}

運行程序,結果如下圖9.1.1所示:

?

9.1.1 系統所有LocationProvider

從圖9.1.1可以看出,當前模擬器所有可用的LocationProvider有如下三個:

??network:由LocationManager.NETWORK_PROVIDER常量表示,它代表通過無線信號基站或Wi-fi網絡獲取定位信息的LocationProvider對象。

??passive:由LocationManager.PASSIVE_PROVIDER常量表示。

??gps:由LocationManager.GPS_PROVIDER常量表示,它代表通過GPS衛星獲取定位信息的LocationProvider對象。

?

LocationManager類提供了訪問定位服務的功能,該類提供了如下常用的方法。

??boolean ?addGpsStatusListener(GpsStatus.Listener listener)

添加一個監聽GPS狀態的監聽器。

??void ?addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent)

設置當臨近某指定位置(經度,緯度)和半徑的位置時的警告信息。

??List<String> ?getAllProviders()

獲取所有的LocationProvider列表。

??String ?getBestProvider(Criteria criteria, boolean enabledOnly)

根據指定條件返回最優的LocationProvider對象。

??GpsStatus ?getGpsStatus(GpsStatus status)

獲取GPS狀態。

??Location ?getLastKnownLocation(String provider)

根據LocationProvider獲取最近一次已知的Location

??LocationProvider ?getProvider(String name)

根據名稱來獲取LocationProvider

??List<String> ?getProviders(Criteria criteria, boolean enabledOnly)

根據指定條件獲取滿足該條件的全部LocationProvider的名稱。

??List<String> ?getProviders(boolean enabledOnly)

獲取所有可用的LocationProvider

??boolean ?isProviderEnabled(String provider)

判斷指定名稱的LocationProvider是否可用。

??void ?removeGpsStatusListener(GpsStatus.Listener listener)

刪除GPS狀態監聽器。

??void ?removeProximityAlert(PendingIntent intent)

刪除一個臨近警告。

??void ?requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)

通過指定的LocationProvider周期性地獲取定位信息,并通過intent啟動相應的組件。

??void ?requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

通過指定的LocationProvider周期性地獲取定位信息,并觸發Listener所對應的觸發器

例如,在示例9.1我們通過調用LocationManagergetAllProviders()方法獲取所有LocationProvider時返回的是List<String>集合,集合元素即為LocationProvider的名稱。我們還可以借助于LocationManagergetProviderString name)方法,獲取指定名稱的LocationProvider對象。例如以下代碼:

// 獲取基于GPSLocationProvider

LocationProvider ?locprovider =

manager.getProvider(LocationManager.GPS_PROVIDER);

前面的程序調用LocationManagergetAllProviders()方法返回了系統所有可用的Location Provider,但大部分時候,應用程序可能希望得到符合指定條件的LocationProvider,這就需要借助于LocationManagergetBestProviderCriteria criteriaboolean enabledOniy)方法來獲取。

除了利用LocationManager類來獲取LocationProvider外,我們還可以借助Criteria類來獲取符合指定條件的LocationProviderCriteria提供如下常用的方法來設置條件。

??void ?setAccuracy(int accuracy)

設置對LocationProvider的精度要求。

??void ?setAltitudeRequired(boolean altitudeRequired)

設置要求LocationProvider能提供高度信息。

??void ?setBearingRequired(boolean bearingRequired)

設置要求LocationProvider能提供方向信息。

??void ?setCostAllowed(boolean costAllowed)

設置要求LocationProvider是否免費。

??void ?setPowerRequirement(int level)

設置要求LocationProvider的耗電量。

??void ?setSpeedRequired(boolean speedRequired)

設置要求LocationProvider能提供速度信息。

示例9.2

根據Criteria類獲取系統中免費的LocationProvider,并且該LocationProvider必須能提供高度信息、速度信息等。

本示例程序采用示例9.1的布局文件,我們重點來看一下Activity類的代碼:

public?class?GetProvidersActivity extends?Activity {

private?ListView listView?= null;

private?LocationManager manager?= null;

?

@Override

public?void?onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.providers);

listView?= (ListView) findViewById(R.id.list);

// 獲取系統的LocationManager對象

manager?= (LocationManager)getSystemService(Context.LOCATION_SERVICE);

// 創建一個LocationProvider的過濾條件

Criteria criteria = new?Criteria();

// 設置要求LocationProvider必須是免費的。

criteria.setCostAllowed(false);

// 設置要求LocationProvider能提供高度信息

criteria.setAltitudeRequired(true);

// 設置要求LocationProvider能提供方向信息

criteria.setBearingRequired(true);

// 獲取系統所有復合條件的LocationProvider的名稱

List<String> providerNames = manager.getAllProviders();

ArrayAdapter<String> adapter = new?ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, providerNames);

// 使用ListView來顯示所有可用的LocationProvider

listView.setAdapter(adapter);

}

}

運行該程序,即可在ListView中看到所有符合 Criteria條件的LocationProvider,程序運行結果和示例9.1相同。

9.3?GPS定位

9.3.1?使用DDMS模擬定位

Android模擬器本身并不能作為GPS接收器,因此無法得到GPS的定位信息,但為了方便程序員測試GPS應用,Android提供了DDMS工具來發送模擬的GPS信息。

啟動Android模擬器之后,然后打開EclipseDDMS透視圖下的Emulator Control面板即可向Android模擬器發送GPS定位信息,如圖9.1.2所示。

?

9.1.2 Emulator Control面板

9.3.2?獲取用戶的位置

當我們可以獲取到LocationProvider的時候,就可以通過其提供的位置組件獲取到設備此時的Position位置信息,到這里,我們就實現了通過手機自帶的GPS設備獲取當前位置信息的一整套簡單流程,下面我們通過一個示例來演示獲取用戶信息的簡單應用。

示例9.3

獲取用戶當前的地理位置,利用DDMS模擬器模擬用戶當前的位置數據。

在布局文件中提供一個按鈕,當用戶單擊這個按鈕時程序能通過LocationProvider周期性地獲取定位信息,并觸發Listener所指定的LocationListener類型的觸發器。Android類及自定義LocationListener的詳細代碼如下:

public?class?UserLocationActivity extends?Activity {

?

@Override

protected?void?onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.userlocation);

Button button1 = (Button) findViewById(R.id.btn1);

button1.setOnClickListener(new?OnClickListener() {

public?void?onClick(View v) {

//通過名字來得到指定的系統級的服務

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,locationListener);???------------------

}

});

}

LocationListener locationListener?= new?LocationListener() {

public?void?onStatusChanged(String provider, int?status, Bundle extras) {

}

public?void?onProviderEnabled(String provider) {

}

public?void?onProviderDisabled(String provider) {

}

public?void?onLocationChanged(Location location) {

System.out.println(location.getLatitude());

System.out.println(location.getLongitude());

}

}

上面的程序中粗體字代碼用于從Location中獲取經度、緯度定位信息。程序中編號為?處的代碼通過LocationManager設置了一個監聽器,該監聽器負責每隔1秒向LocationProvider請求一次定位信息,當用戶的定位信息發生改變時,系統會在LogCat下輸出用戶的定位信息。程序中用到的requestLocationUpdates()方法的原型如下:

void LocationManager.requestLocationUpdates(String?provider, long minTime, float minDistance, LocationListener?listener)

該方法通過指定的LocationProvider周期性地獲取定位信息,并出發listener所對應的觸發器。

定位提供者LocationProvider對象就是GPS定位組件的抽象表示,通過LocationProvider可以獲取該定位組件的相關信息。LocationProvider提供了如下常用方法。

??abstract int ?getAccuracy()

返回LocationProvider的精度。

??String ?getName()

返回LocationProvider的名稱。

??abstract int ?getPowerRequirement()

獲取LocationProvider的電源需求。

??abstract boolean ?hasMonetaryCost()

??返回該LocationProvider是收費的還是免費的

??boolean ?meetsCriteria(Criteria criteria)

??判斷該LocationProvider是否滿足Criteria條件。

??abstract boolean ?requiresCell()

判斷該LocationProvider是否需要訪問網絡基站。

??abstract boolean ?requiresNetwork()

判斷該LocationProvider是否需要網絡數據。

??abstract boolean ?requiresSatellite()

判斷該LocationProvider是否需要訪問基于衛星的定位系統。

??abstract boolean ?supportsAltitude()

判斷該LocationProvider是否支持高度信息。

??abstract boolean ?supportsBearing()

判斷該LocationProvider是否支持方向信息。

??abstract boolean ?supportsSpeed()

判斷該LocationProvider是否支持速度信息。

onLocationChanged?方法的參數的類型Location代表位置信息的抽象類,該類是GPS技術的一個很重要的類,它提供了如下重要的方法:

??boolean ?hasAccuracy()

獲取定位信息的精度。

??double ?getAltitude()

獲取定位信息的高度。

??float ?getBearing()

獲取定位信息的方向。

??double ?getLatitude()

獲取定位信息的緯度。

??double ?getLongitude()

獲取定位信息的經度。

??String ?getProvider()

獲取提供該定位信息的LocationProvider

??float ?getSpeed()

獲取定位信息的速度。

??boolean ?hasAccuracy()

判斷該定位信息是否有精度信息。

??boolean ?hasAltitude()

判斷該定位信息是否有高度信息。

??boolean ?hasBearing()

判斷該定位信息是否有方向信息。

??boolean ?hasSpeed()

判斷該定位信息是否有速度信息。

?

該程序需要有訪問GPS信號的權限,因此需要在AndroidManifest.xml文件中增加如下授權代碼片段:

<!—授權獲取定位信息-->

<use-permission androidname=’”android.permission.ACCESS_FINE_LOCATION”/>

?

首先運行該程序,然后單擊圖9.2中的【Send】按鈕,在EclipseLogCat下我們會看到用戶的位置信息,如下圖9.1.3所示。

?

9.1.3 用戶位置信息

如果把該程序與Google Map結合,讓該程序根據GPS提供的信息實時地顯示用戶在地圖上的位置,即可開發出GPS導航系統。

9.3.3?指定區域臨近警告

通過上面的示例,我們已經可以獲取到設備所在的位置信息,但是,簡單的經緯度信息對我們來說依然用處不大,實際生活中,我們更多的是通過GPS功能尋找我們的目的地,這里的目的地其實也是一個經緯度代表的位置信息,當我們靠近此位置達到一定的半徑范圍時,會有相應的提示通知我們,例如很多車輛上的GPS導航系統中會內置道路上的攝像頭位置,當到此區域時提醒司機注意行駛速度等,這里就需要我們能判斷出用戶與指定位置之間的距離關系,當用戶臨近此指定位置時給出警告,這也就是我們這節要講的位置臨近警告。

所謂臨近警告指的是當用戶手機不斷靠近指定固定點,當與該固定點的距離小于指定范圍時,系統可以觸發相應的處理。Android中,LocationManager類提供了一個名稱為addProximityAlertdouble latitudedouble longitudefloat radiuslong expiration,PendingIntent intent)方法,該方法用于添加一個臨近警告,它參數的說明如下。

??longitude:指定固定點的經度。

??latitude:指定固定點的緯度。

??radius:該參數指定一個半徑長度。

??expiration:該參數指定經過多少毫秒后該臨近警告就會過期失效。-1指定永不過期。

??intent:該參數指定臨近該固定點時觸發該intent對應的組件。

?

示例9.4

指定區域臨近警告。

本示例程序演示了如何檢測手機是否進入鄭州二七廣場。當程序啟動后,程序就會添加一個臨近警告,當用戶臨近鄭州二七廣場所在緯度、經度時,系統會以文本的形式在屏幕上顯示提示信息。

本程序的實現思想是借助一個Intent接收器以經緯度為圓心以指定值為半徑劃定一個區域,當設備出入該區域時,發出提醒信息。

本示例的布局文件比較簡單,在布局文件里面只提供了一個TextView,用來顯示當用戶進出二七廣場時的提示信息。我們來重點看一下Activity類的代碼:

public?class?ProximityActivity extends?Activity {

private?TextView textView?= null;

private?LocationManager manager?= null; ??// 定位服務管理器實例

?

@Override

public?void?onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.proximity);

textView?= (TextView) findViewById(R.id.textView1);

?

// 通過getSystemService方法獲得LocationManager實例

manager?= (LocationManager) getSystemService(Context.LOCATION_SERVICE);

?

double?longitude = 113.66632841527462;

double?latitude = 34.752014421190424;

?

float?radius = 2500;// 定義半徑(2.5公里)

// 定義Intent

Intent intent = new?Intent(this, ProximityAlertReciever.class);

// Intent包裝成PendingIntent

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, -1, intent, 0);

// 添加臨近警告

manager.addProximityAlert(latitude, longitude, radius, -1, pendingIntent);

}

?

class?ProximityAlertReciever extends?BroadcastReceiver {

@Override

public?void?onReceive(Context context, Intent intent) {

// 獲取是否為進入指定區域

boolean?isEnter = intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);

if?(isEnter) {

textView.setText("您已經進入鄭州二七廣場");// 顯示提示信息

} else?{

textView.setText("您已經離開鄭州二七廣場");// 顯示提示信息

}

}

}

}

在上面的Activity類,我們通過自定義的廣播接收者,當廣播到來時,根據不同的情況在屏幕上來顯示用戶進出二七區時的相應提示信息。

注意:不要忘記在功能清單文件中對廣播進行注冊。

打開DDMSEmulator Control面板,在其中輸入指定的緯度、經度信息,我們可以看到下圖9.1.49.1.5所示的效果。

?

9.1.4 進入指定地點

?

9.1.5 離開指定地點

本示例可以和下一章中將要講到的Google Map一起使用,完成許多非常有特色的功能。


任務實訓部分?

1自定義實現一個位置記錄器

訓練技能點

如何獲取用戶位置

需求說明

在本節中我們學習了如何獲取用戶位置,假設我們在做一個服務器(比如一個網站),當用戶移動時,隨時將用戶的位置信息提交到服務器端。這個在現實生活中是有很大應用的,比如父母可利用它來臨近孩子玩耍的地點,避免孩子丟失。

根據此需求,實現網站和手機端的應用。

?

2查找最合適的LocationProvider

訓練技能點

利用Criteria查找滿足指定條件的LocationProvider

需求說明

在實際的應用中,一般情況下我們需要的不是所有的LocationProvider,而是滿足指定條件的LocationProvider,比如免費、需要網絡數據、支持高度信息等。本示例要求大家完成查找滿足低電耗、支持高度、免費的LocationProvider

實現思路

核心代碼如下:

Criteria criteria = new?Criteria();

criteria.setAccuracy(Criteria.ACCURACY_FINE);

criteria.setPowerRequirement(Criteria.POWER_LOW);

criteria.setAltitudeRequired(false);

criteria.setSpeedRequired(false);

criteria.setCostAllowed(false);

//通過名字來得到指定的系統級的服務

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

String provider = manager.getBestProvider(criteria, false);

System.out.println(provider);

??


鞏固練習

一、簡答題

1.?簡要描述GPS是什么以及它的功能。?

2.?簡述在Android中獲取GPS定位信息的步驟。?

二、上機練習

???編寫一個小型的動畫,動畫界面中提供一個小車(用圖片表示),一條帶有障礙物的道路。當汽車在道路上行走,接近道路上的路障時,汽車自動停止或繞開。?

?

總結

以上是生活随笔為你收集整理的GPS用户定位的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。