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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android Developers Training】 104. 接受地点更新

發布時間:2025/4/9 Android 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android Developers Training】 104. 接受地点更新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。

原文鏈接:http://developer.android.com/training/location/receive-location-updates.html


如果你的應用有導航的功能,你可能會希望可以定期獲取用戶的地理位置。雖然你可以通過LocationClient.getLastLocation()做到這一點,但是一個更加直接的方法是向定位服務申請定期更新。作為響應,定位服務會自動用最佳的地理位置信息(基于當前激活的可以提供位置信息的傳感器,如WiFi或者GPS)更新到你的應用。

要從定位服務定期獲取地理位置更新,你使用定位客戶端發送一個請求。根據請求的形式,定位服務或是激活一個回調函數,并把一個Location對象傳遞給該函數,或是發送一個Intent,在其數據部分包含了地理位置信息。有兩方面因素會影響精度和頻率,一個是你的應用申請的定位權限,一個是你在請求中傳遞給定位服務的參數。


一). 指定應用權限

使用位置服務的應用必須請求定位權限。Android有兩個定位權限:ACCESS_COARSE_LOCATION(粗定位)和ACCESS_FINE_LOCATION(精定位)。你所選擇的權限決定了定位的精度。如果你只請求粗定位,位置服務所范圍的地點信息大致會精確到一個城市街區。

如果請求ACCESS_FINE_LOCATION,它也暗含了ACCESS_COARSE_LOCATION的權限。

例如,要添加ACCESS_COARSE_LOCATION,將下面的代碼作為<manifest>元素的子元素:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

二). 檢查Google Play服務

位置服務是Google Play服務APK的其中一部分。由于用戶設備的狀態時難以預料的,你應該一直在你嘗試連接定位服務之前,檢查APK是否已經安裝。要檢查APK是否安裝,可以調用GooglePlayServicesUtil.isGooglePlayServicesAvailable(),它會返回一個整形的結果碼,其含義可以參閱:ConnectionResult。如果你遇到了一個錯誤,可以調用GooglePlayServicesUtil.getErrorDialog(),來獲取一個本地的對話框,引導用戶執行正確地行為,之后將這一對話框顯示在一個DialogFragment上。這一對話框可能允許用戶解決當前的問題,此時Google Play服務會發回一個結果到你的activity中。要處理這一結果,需要覆寫onActivityResult()方法。

Note:

要使你的應用可以兼容1.6及以后版本的系統,顯示DialogFragment的activity必須是FragmentActivity的子類,而非Activity。使用FragmentActivity還可以允許你調用getSupportFragmentManager()方法來顯示DialogFragment。

由于你一直需要在你的代碼多個地方檢查Google Play服務,所以應該定義一個方法將檢查行為進行封裝,之后在每次連接嘗試之前進行檢查。下面的代碼片段包含了檢查Google Play服務所需要的代碼:

public class MainActivity extends FragmentActivity {...// Global constants/** Define a request code to send to Google Play services* This code is returned in Activity.onActivityResult*/private final static intCONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;...// Define a DialogFragment that displays the error dialogpublic static class ErrorDialogFragment extends DialogFragment {// Global field to contain the error dialogprivate Dialog mDialog;// Default constructor. Sets the dialog field to nullpublic ErrorDialogFragment() {super();mDialog = null;}// Set the dialog to displaypublic void setDialog(Dialog dialog) {mDialog = dialog;}// Return a Dialog to the DialogFragment. @Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {return mDialog;}}.../** Handle results returned to the FragmentActivity* by Google Play services*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// Decide what to do based on the original request codeswitch (requestCode) {...case CONNECTION_FAILURE_RESOLUTION_REQUEST :/** If the result code is Activity.RESULT_OK, try* to connect again*/switch (resultCode) {case Activity.RESULT_OK :/** Try the request again*/...break;}...}...}...private boolean servicesConnected() {// Check that Google Play services is availableint resultCode =GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);// If Google Play services is availableif (ConnectionResult.SUCCESS == resultCode) {// In debug mode, log the statusLog.d("Location Updates","Google Play services is available.");// Continuereturn true;// Google Play services was not available for some reason} else {// Get the error codeint errorCode = connectionResult.getErrorCode();// Get the error dialog from Google Play servicesDialog errorDialog = GooglePlayServicesUtil.getErrorDialog(errorCode,this,CONNECTION_FAILURE_RESOLUTION_REQUEST);// If Google Play services can provide an error dialogif (errorDialog != null) {// Create a new DialogFragment for the error dialogErrorDialogFragment errorFragment =new ErrorDialogFragment();// Set the dialog in the DialogFragment errorFragment.setDialog(errorDialog);// Show the error dialog in the DialogFragment errorFragment.show(getSupportFragmentManager(),"Location Updates");}}}... }

在后續章節的代碼片段中,都會調用這一方法來驗證是否可獲取Google Play服務。


三). 定義位置服務回調函數

在你創建定位客戶端之前,實現定位服務的接口,以和你的應用進行交互:

ConnectionCallbacks

指定當定位連接上或者沒有連接上時,定位服務調用的方法。

OnConnectionFailedListener

指定當嘗試連接到定位客戶端時,如果出現了錯誤,定位服務調用的方法。這一方法使用之前定義的showErrorDialog方法來顯示一個錯誤對話框,它嘗試使用Google Play服務來解決這一問題。

下面的樣例代碼展示了如何指定接口和定義相關的函數:

public class MainActivity extends FragmentActivity implementsGooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener {.../** Called by Location Services when the request to connect the* client finishes successfully. At this point, you can* request the current location or start periodic updates*/@Overridepublic void onConnected(Bundle dataBundle) {// Display the connection statusToast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();}.../** Called by Location Services if the connection to the* location client drops because of an error.*/@Overridepublic void onDisconnected() {// Display the connection statusToast.makeText(this, "Disconnected. Please re-connect.",Toast.LENGTH_SHORT).show();}.../** Called by Location Services if the attempt to* Location Services fails.*/@Overridepublic void onConnectionFailed(ConnectionResult connectionResult) {/** Google Play services can resolve some errors it detects.* If the error has a resolution, try sending an Intent to* start a Google Play services activity that can resolve* error.*/if (connectionResult.hasResolution()) {try {// Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(this,CONNECTION_FAILURE_RESOLUTION_REQUEST);/** Thrown if Google Play services canceled the original* PendingIntent*/} catch (IntentSender.SendIntentException e) {// Log the error e.printStackTrace();}} else {/** If no resolution is available, display a dialog to the* user with the error.*/showErrorDialog(connectionResult.getErrorCode());}}... }

定義地理位置更新回調函數

定位服務或是以一個Intent的形式,或者以一個參數的形式將為之更新傳遞給一個你定義的回調函數。這節課將會講解如何使用一個回調函數來獲取更新,課程中使用的代碼基本可以用于任何應用場景。如果你想要以一個Intent的形式接收位置更新,可以閱讀:Recognizing the User's Current Activity。它提供了類似的可以參考的模板。

位置服務所調用的將為之更新發送給你的應用的回調函數是在LocationListener接口的onLocationChanged()方法中指定的。傳入的參數是一個Location對象,包含了地點的經緯度。下面的代碼片段展示了如何指定接口和定義方法:

public class MainActivity extends FragmentActivity implementsGooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener,LocationListener {...// Define the callback method that receives location updates @Overridepublic void onLocationChanged(Location location) {// Report to the UI that the location was updatedString msg = "Updated Location: " +Double.toString(location.getLatitude()) + "," +Double.toString(location.getLongitude());Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();}... }

現在你已經有了回調函數,你可以配置位置更新的請求了。首先第一步是指定控制更新的參數。


四). 指定更新參數

定位服務允許你控制更新之間的時間間隔以及你期望的位置精確度,通過設置LocationRequest對象中的值,再將這一對象作為你的請求的一部分發出以開始更新。

首先,設置下列間隔參數:

更新間隔:

通過LocationRequest.setInterval()設置。這一方法以毫秒為單位設置你的應用接收更新的事件間隔。如果沒有其它應用從定位服務接收更新,那么你的應用將會以這一頻率接收更新。

最快更新間隔:

通過LocationRequest.setFastestInterval()設置。這一方法設置的是你的應用能處理更新的最快間隔時間,以毫秒為單位。你需要設置這個頻率是因為其它應用也會影響位置更新非頻率。定位服務會以所有應用通過LocationRequest.setInterval()設置的最快的間隔時間來發送更新。如果這一頻率比你的應用能夠處理的頻率要快,那么你可能會遇到UI閃爍或數據溢出等問題。為了避免這一情況發生,應該調用LocationRequest.setFastestInterval()這一方法設置更新頻率的最高限額。

調用LocationRequest.setFastestInterval()方法還可以節省電量。當你通過LocationRequest.setInterval()請求了一個更新間隔后,又用LocationRequest.setFastestInterval()請求了一個最大速率后,你的應用會以正常速率進行更新。如果其它應用使用了一個更快的更新速率,那么你的更新頻率也會加快。如果沒有其它應用申請了更快的更新速率,那么你的應用會以LocationRequest.setInterval()中所設置的速率進行更新。

接下來,設置精度參數。在一個前臺應用程序中,你需要以高頻率更新地理位置,所以使用LocationRequest.PRIORITY_HIGH_ACCURACY設置精度。

下面的代碼片段展示課如何設置更新間隔和精度:

public class MainActivity extends FragmentActivity implementsGooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener,LocationListener {...// Global constants ...// Milliseconds per secondprivate static final int MILLISECONDS_PER_SECOND = 1000;// Update frequency in secondspublic static final int UPDATE_INTERVAL_IN_SECONDS = 5;// Update frequency in millisecondsprivate static final long UPDATE_INTERVAL =MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;// The fastest update frequency, in secondsprivate static final int FASTEST_INTERVAL_IN_SECONDS = 1;// A fast frequency ceiling in millisecondsprivate static final long FASTEST_INTERVAL =MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS;...// Define an object that holds accuracy and frequency parameters LocationRequest mLocationRequest;...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Create the LocationRequest objectmLocationRequest = LocationRequest.create();// Use high accuracy mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);// Set the update interval to 5 seconds mLocationRequest.setInterval(UPDATE_INTERVAL);// Set the fastest update interval to 1 second mLocationRequest.setFastestInterval(FASTEST_INTERVAL);...}... }

Note:

如果你的應用要訪問網絡或者在接收到更新后需要做其它長期的任務,那么應該調整更新頻率到一個比較慢的值。這可以避免你的應用接收到太多它來不及處理的更新數據。一旦長期處理的任務結束了,可以再通過設置最快更新頻率到一個較快的值。


五). 開始位置更新

要發送位置更新請求,在onCreate()創建一個定位客戶端,之后連接它,并通過requestLocationUpdates()發起請求。因為你的客戶端必須連接以后你的應用才能收到更新,所以你應該在onStart()方法中連接到客戶端。這能保證當你的應用可見時,你都能獲取一個已連接的有效的客戶端。因為你需要在發出請求前先進行連接,所以在ConnectionCallbacks.onConnected()發出更新請求。

另外要記住用戶可能會有各種各樣的原因希望關閉位置更新。你應該為用戶提供一個這樣做的方法,并且你應該保證當更新關閉了之后,你不會在onStart()中啟動更新。為了記錄用戶的設置,在onPause()方法中保存應用的SharedPreferences,并在onResume()方法中獲取它。

下面的代碼片段展示了如何在onCreate()方法中設置客戶端,以及如何在onStart()方法中連接并發出更新請求:

public class MainActivity extends FragmentActivity implementsGooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener,LocationListener {...// Global variables ...LocationClient mLocationClient;boolean mUpdatesRequested;...@Overrideprotected void onCreate(Bundle savedInstanceState) {...// Open the shared preferencesmPrefs = getSharedPreferences("SharedPreferences",Context.MODE_PRIVATE);// Get a SharedPreferences editormEditor = mPrefs.edit();/** Create a new location client, using the enclosing class to* handle callbacks.*/mLocationClient = new LocationClient(this, this, this);// Start with updates turned offmUpdatesRequested = false;...}...@Overrideprotected void onPause() {// Save the current setting for updatesmEditor.putBoolean("KEY_UPDATES_ON", mUpdatesRequested);mEditor.commit();super.onPause();}...@Overrideprotected void onStart() {...mLocationClient.connect();}...@Overrideprotected void onResume() {/** Get any previous setting for location updates* Gets "false" if an error occurs*/if (mPrefs.contains("KEY_UPDATES_ON")) {mUpdatesRequested =mPrefs.getBoolean("KEY_UPDATES_ON", false);// Otherwise, turn off location updates} else {mEditor.putBoolean("KEY_UPDATES_ON", false);mEditor.commit();}}.../** Called by Location Services when the request to connect the* client finishes successfully. At this point, you can* request the current location or start periodic updates*/@Overridepublic void onConnected(Bundle dataBundle) {// Display the connection statusToast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();// If already requested, start periodic updatesif (mUpdatesRequested) {mLocationClient.requestLocationUpdates(mLocationRequest, this);}}... }

更多關于保存配置信息的知識,可以查看:Saving Key-Value Sets。


六). 停止位置更新

要停止位置更新,在onPause()方法中保存更新標識的狀態,并在onStop()方法中通過調用removeLocationUpdates(LocationListener)來停止更新,例如:

public class MainActivity extends FragmentActivity implementsGooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener,LocationListener {.../** Called when the Activity is no longer visible at all.* Stop updates and disconnect.*/@Overrideprotected void onStop() {// If the client is connectedif (mLocationClient.isConnected()) {/** Remove location updates for a listener.* The current Activity is the listener, so* the argument is "this".*/removeLocationUpdates(this);}/** After disconnect() is called, the client is* considered "dead".*/mLocationClient.disconnect();super.onStop();}... }

現在你已經有了請求并接收定期位置更新的基本應用框架。你可以將這節課中所講的東西結合到導航,行為識別,反地址解析等等場景中。

下一節課中,我們將會講解如何使用當前地點顯示現在的街道地址。

轉載于:https://www.cnblogs.com/jdneo/p/3714124.html

總結

以上是生活随笔為你收集整理的【Android Developers Training】 104. 接受地点更新的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 在线国产欧美 | 深夜成人在线观看 | 精品久久久久久久久久久久 | 美女爆乳18禁www久久久久久 | 天天射,天天干 | 精品人妻午夜一区二区三区四区 | www.黄色一片 | 黄色av视屏 | 最新av在线 | 不卡影院 | 成人爽站w47pw | 久久精品一区二区三区不卡牛牛 | 日韩一级完整毛片 | 国内少妇毛片视频 | 大桥未久av在线播放 | 久久久久国产精品一区二区 | 裸体视频软件 | 日日夜夜精品免费 | 人人澡人人看 | 久久色网站 | 精品人妻一区二区三区四区 | 日本在线免费观看 | 97香蕉视频| 91亚洲免费 | 国产伦精品一区二区三区精品 | 在线观看色网 | 99爱精品| 日韩一级大片 | 女人叫床很黄很污句子 | 欧美成人免费在线观看 | 国产精品无码一区二区三区在线看 | 使劲插视频 | 国产剧情一区在线 | 91超碰在线免费观看 | 91影院在线免费观看 | 日本一区二区三区在线看 | 自拍一级片 | 黄色一极视频 | 国产69精品久久久久久久 | 国产剧情在线观看 | 亚洲精品 日韩无码 | 国产精品日韩一区二区 | 久久亚洲精品视频 | 性欧美极品 | 欧美黄色性视频 | 精品无码一区二区三区蜜臀 | 男女福利视频 | 99久久夜色精品国产亚洲 | 国产精品色在线网站 | 久久一 | 久久无码人妻一区二区三区 | 成人激情视频网站 | 中文字幕激情小说 | 在线看不卡av | 亚洲人成久久 | 亚洲熟女乱色一区二区三区 | 久久久久人妻一区精品色欧美 | av地址在线 | 日韩精品在线观看一区二区 | 欧美色图一区二区 | 中文字幕视频免费观看 | 91国内| www久久久com | 春物催眠 | 狗爬女子的视频 | 伊人亚洲精品 | 天天曰夜夜操 | 国产免费久久精品国产传媒 | 欧美黑人添添高潮a片www | 久久久久成人精品 | 69影院在线观看 | 91亚洲精品久久久蜜桃网站 | 大肉大捧一进一出好爽动态图 | 国产精华一区二区三区 | 亚洲国产精品va在线看黑人 | 熟女少妇精品一区二区 | 亚洲天堂一区二区三区四区 | 国产 一二三四五六 | 成年人免费在线 | 日韩一区中文 | 久久亚洲免费视频 | 娇妻第一次尝试交换的后果 | 黑料福利 | 国产精品久久久久91 | 潘金莲一级淫片aaaaa武则天 | 日日射日日操 | 色丁香av | 成年人免费在线视频 | 日韩精品视频一区二区在线观看 | 在线观看的黄网 | 午夜亚洲精品 | 日韩免费av网站 | 伊人88| 黑人玩弄人妻一区二区三区影院 | 亚洲国产黄 | 热99精品| 538国产精品视频一区二区 | 天天干国产| 女人下面无遮挡 |