Android位置服務開發

原文地址:http://www.devdiv.com/Android-android_-thread-129718-1-1.html


一、LocationManager類簡介
        
        Android中LocationManager類提供了獲取系統地理位置服務,這些服務允許應用程序定期獲取設備地理位置更新信息,或者查詢上一個已知位置;註冊/註銷來自某個LocationProvider的週期性的位置更新;以及註冊/註銷接近某個座標時對一個已定義Intent的觸發等。

        以下是對android location包中一些重要的類的說明:

        LocationProvider:是location提供者類的抽象父類。一個Location提供者提供了設備定期的地理位置信息。

        LocationListener:當地理位置改變時,該類提供了回調函數通知應用程序。這個監聽對象必須被LocationManager註冊。

        Criteria:該類爲應用程序選擇合適的Location Provider。


        下面簡要描述一下LocationManager的工作流程:

        首先,直接實例化LocationManager是不允許的,必須通過以下代碼來獲取LocationManager實例。

1 LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);


        通過得到的LocationManager實例,我們可以通過下面的語句來註冊一個週期性的位置更新。以下代碼從GPS獲取位置信息,並且每隔5秒更新一次。最後一個參數是LocationListener的一個引用,我們必須要實現這個類。

01 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 50000, locationListener);  
02  
03 private final LocationListener locationListener = new LocationListener() {  
04     public void onLocationChanged(Location location) {
05         // log it when the location changes  
06         if (location != null) {  
07             Log.i("getLocation",  "Location changed : Lat: " + location.getLatitude() +" Lon: " + location.getLongitude());  
08             double latitude = location.getLatitude();
09             double longitude = location.getLongitude();
10             double altitude = location.getAltitude();
11         }  
12     }
13 }

        我們可以通過下面的方法來取得上一次獲得的位置信息:

1     Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);  

        最後,需要注意的是,要在AndroidManifest.xml中添加權限設置:

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

二、LocationManager類使用

        下面以一個完整的Android工程代碼作爲示例,介紹瞭如何使用獲得當前設備位置信息。該Demo通過調用LocationManager的getLastKnownLocation方法,顯示設備的經度和緯度信息。

        JAVA代碼如下:

01 package com.devdiv.test.locationmanager_test;
02  
03 import android.app.Activity;
04 import android.content.Context;
05 import android.location.Location;
06 import android.location.LocationManager;
07 import android.os.Bundle;
08 import android.widget.TextView;
09  
10 public class LocationManager_TestActivity extends Activity {
11     /** Called when the activity is first created. */
12     @Override
13     public void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.main);
16          
17         LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
18         Location mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
19          
20         updateWithNewLocation(mLocation);
21     }
22      
23     private void updateWithNewLocation(Location location) {
24              
25             String mLocationInfo = null;
26              
27             if (location != null) {
28                     double lat = location.getLatitude();
29                     double lon = location.getLongitude();
30                     mLocationInfo = "Latitude:" + lat + "\n" "Longitude:" + lon;
31                 else {
32                         mLocationInfo = "No location found";
33                 }
34              
35             ((TextView )findViewById(R.id.txt_location_info)).setText(mLocationInfo);
36     }
37 }

        注意:需要在AndroidManifest.xml配置相應權限:

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


三、LocationManager類使用深入

        下面的代碼展示瞭如何使用LocationListener來獲得位置信息更新。

        JAVA代碼如下:

01 package com.devdiv.test.locationmanager_test2;
02  
03 import android.app.Activity;
04 import android.content.Context;
05 import android.location.Location;
06 import android.location.LocationListener;
07 import android.location.LocationManager;
08 import android.location.LocationProvider;
09 import android.os.Bundle;
10 import android.util.Log;
11 import android.widget.TextView;
12 import android.widget.Toast;
13  
14 public class LocationManager_Test2Activity extends Activity implements LocationListener {
15          
16         LocationManager mLocationManager;
17     TextView mTextView;
18     TextView mTextView2;
19      
20      
21     /** Called when the activity is first created. */
22     @Override
23     public void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.main);
26          
27         mTextView = (TextView) findViewById(R.id.txt_location_info);
28         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
29          
30         Location mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
31         if(mLocation != null) {
32                 mTextView.setText("Latitude:" + mLocation.getLatitude() + "\n" +"Longitude:" + mLocation.getLongitude());
33         else {
34                 mTextView.setText("Location not found!");
35         }
36          
37         //注意requestLocationUpdates各個參數的含義!
38         mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 50000,this);
39  
40          
41     }
42  
43         //在provider狀態改變的時候執行下面的操作,狀態可以分爲:AVAILABLE、OUT_OF_SERVICE、TEMPORARILY_UNAVAILABLE
44         //OUT_OF_SERVICE:if the provider is out of service, and this is not expected to change in the near future;
45         //TEMPORARILY_UNAVAILABLE:if the provider is temporarily unavailable but is expected to be available shortly;
46         //AVAILABLE:if the provider is currently available.
47         @Override
48         public void onStatusChanged(String provider, int status, Bundle extras) {
49                 // TODO Auto-generated method stub
50                 Log.d("test""onStatusChanged");
51 //                mTextView2.setText("onStatusChanged");
52                  
53                 Toast.makeText(this"onStatusChanged", Toast.LENGTH_SHORT).show();        
54                  
55                 if (status == LocationProvider.AVAILABLE) {
56 //                        mTextView2.setText("LocationProvider.AVAILABLE");
57                 else if (status == LocationProvider.OUT_OF_SERVICE) {
58 //                        mTextView2.setText("LocationProvider.OUT_OF_SERVICE");
59                 else if (status == LocationProvider.TEMPORARILY_UNAVAILABLE) {
60 //                        mTextView2.setText("LocationProvider.TEMPORARILY_UNAVAILABLE");
61                 }
62                  
63         }
64          
65         @Override
66         public void onProviderEnabled(String provider) {
67                 // TODO Auto-generated method stub
68                 Log.d("test""onProviderEnabled");
69         }
70          
71         @Override
72         public void onProviderDisabled(String provider) {
73                 // TODO Auto-generated method stub
74                 Log.d("test""onProviderDisabled");
75         }
76          
77         @Override
78         public void onLocationChanged(Location location) {
79                 // TODO Auto-generated method stub
80                 Log.d("test""onLocationChanged");
81 //                double lat = location.getLatitude();
82 //                double lon = location.getLongitude();
83 //                mTextView.setText("Latitude:" + lat + "\n" + "Longitude:" + lon + "\n" + "onLocationChanged");
84                  
85                 mTextView.setText("Latitude:" + location.getLatitude() + "\n" +"Longitude:" + location.getLongitude() + "\n" "onLocationChanged");
86                  
87 //                Toast.makeText(this, "onLocationChanged", Toast.LENGTH_SHORT).show();               
88         }
89  
90 }

        注意:需要在AndroidManifest.xml配置相應權限

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章