Android 位置服務——用戶定位User Location


  哎,這幾天有點偷懶,博客幾天沒有更新啦,自己攢了一大堆知識沒有整理,今天要抓緊調整狀態,恢復之前的狀態哦, 哦哦,不扯了,下面說今天總結的內容是基於位置服務的用戶定位。
  這項功能在手機應用中在常見不過了啦,QQ空間發狀態有定位,微信有定位,滴滴打車更不用說,各種地圖還有等等好多的應用都有定位的功能,那么這些為用戶定位的功能是如何實現的呢,下面我們首先來看與用戶定位有關的API。

User Location API

LocationManager:主要用於管理用戶定位服務。

LocationProvider:主要用於管理設備獲取用戶位置所使用定位服務。現在目前的手機有三種定位功能:GPS, NETWORK,PASSIVE

  • GPS是我們很熟悉的衛星定位,通常我們的位置都是有三個衛星確定的。GPS的精度比較高,但是慢而且消耗電力,而且可能因為天氣原因或者障礙物而無法獲取衛星信息,另外有些設備可能沒有GPS模塊
  • NETWORK是通過網絡定位。就像現在的聯通和移動在各地都設置了信號塔,為我們提供手機信號,它的定位就是通過確定我們使用的哪個信號塔,然后通過確定信號談的位置來估算我們的位置。精度低,耗電少,獲取信息速度較快,不依賴GPS模塊。
  • PASSIVE是一種被動的定位。現在很少使用這種定位方式,大多是使用前兩種。

LocationListener:該類重要用於監聽定位,當用戶的位置發生改變或其他,我們想要對其進行操作時,我們可以使用該監聽器。

獲取用戶Location

  獲取用戶的位置信息,這里我們獲取用戶的經緯度。我們還是按照步驟講解:
1. 添加權限。
  注意:這里聲明了兩個權限:ACCESS_FINE_LOCATION,聲明定位精度高的權限,一般是用於GPS,也可以是NETWORK;ACCESS_COARSE_LOCATION,聲明定位精度低的權限,可以是NETWORK。

 <!--聲明定位的權限-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

2. 創建LocationManager的對象通過getSystemService(Context.LOCATION_SERVICE)

//這里要強制造型,因為getSystemService()方法返回的是一個Object的對象。
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

3. 綁定一個監聽器,通過監聽器中闖入的LocationListener來獲取經緯度信息。

              //綁定一個監聽器
manager.requestLocationUpdates(provider, 0, 0, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//該方法當用戶位置改變時調用
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
//當定位功能提供發生改變時調用
}
@Override
public void onProviderEnabled(String provider) {
//當定位提供器可用時調用
}
@Override
public void onProviderDisabled(String provider) {
//當定位提供器不可用時調用
}
});

獲取移動用戶Location

  有時候我們想定位位置不斷改變的用戶,這時我們該如何做呢?
  還記的我們在上一節中注冊監聽器的方法么requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener),這個方法傳入四個參數:
provider:定位功能的提供類型。分為GPS_PROVIDER, NETWORK_PROVIDER, PASSIVE_PROVIDER。
minTime:兩次定位之間的時間間隔,單位是ms。
minDistance:兩次定位的最小距離,單位是m。
listener:我們定義的LocationListener 定位監聽器對象。

  如果我們想每隔10s,以及每隔10m給用戶定位一次,我們可以書寫如下:

public class MainActivity extends Activity implements LocationListener {
private TextView mTextViewLongtitude;
private TextView mTextViewLatitude;

private LocationManager manager;//定義LocationManager的對象
private String provider;//定義位置提供者的類型
private List<String> providers;//獲取定位提供者的對象

private double longitute;//用戶的經度
private double latitude;//用戶的緯度

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewLongtitude = (TextView) findViewById(R.id.textview_longtitude);
mTextViewLatitude = (TextView) findViewById(R.id.textview_latitude);
//步驟一:獲取位置LocationManager對象
manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//獲得所有的位置提供器
providers=manager.getProviders(true);
if(providers.contains(LocationManager.GPS_PROVIDER)){
provider=LocationManager.GPS_PROVIDER;
}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
provider=LocationManager.NETWORK_PROVIDER;
}else {
Toast.makeText(getApplicationContext(), "沒有相應的位置提供器!", Toast.LENGTH_SHORT).show();
}
manager.requestLocationUpdates(provider, 10000, 10, this);
}

@Override
public void onLocationChanged(Location location) {
longitute = location.getLongitude();
mTextViewLongtitude.setText(""+longitute);
latitude = location.getLatitude();
mTextViewLatitude.setText(""+latitude);
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onProviderDisabled(String provider) {
}
}

獲取LocationProvider

獲取所有的LocationProvider

  一直說我們的手機上有三種位置提供器也不太靠譜,下面我們來獲得一下這三種位置提供器。
  我們通過LocationManager對象調用getProviders(true)方法可以獲得所有已開啟的位置提供器,通過調用getAllProviders()方法可以獲得所有的設備中的位置提供器。這里我們通過該方法獲得設備的位置提供器,然后循環輸出下:

List<String> pros = manager.getAllProviders();
for (String pro:pros) {
Log.d("data", ""+pro);//輸出所有的位置提供器
}

獲取最好的LocationProvider

  有時候家人問我們晚飯吃什么,我們可能不清楚自己到底具體想吃什么,但是我們清楚的知道我們不吃什么,我們可以通過告訴家人我們不喜歡吃什么,然后他們依據這些來給我們做最適合的晚餐。
  在使用位置提供器是我們想要最好最適合的,我們如何獲得呢?
  想要篩選出最適合的位置提供器,我們就要使用一個類Criteria。先看這個類的相關介紹:

  A class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.
  Criteria是一個通過設定相關的信息,例如:精度,電量使用, 海拔高度是否提供,速度,方位以及是否收費等功能來篩選出Provider。

  • setAccuracy(int accuracy):設置精度要求,有兩種:ACCURACY_COARSE,ACCURACY_FINE。
  • setPowerRequirement(int level):設置電量水平。
  • setAltitudeRequired(boolean altitudeRequired):設置是否提供海拔。
  • setSpeedRequired(boolean speedRequired):設置是否需要速度。
  • setCostAllowed(boolean costAllowed):設置是否產生費用。

      除此之外還有很多方法,這里我們只列舉這些,具體可以去API查詢。

                //首先生成一個Criteria的對象
Criteria criteria = new Criteria();
//設置查詢的條件
criteria.setAccuracy(Criteria.ACCURACY_FINE);//設置精度要求為高
criteria.setPowerRequirement(Criteria.POWER_LOW);//設置電量要求為低
criteria.setAltitudeRequired(false);//不需要還把要求
criteria.setSpeedRequired(false);//不需要速度
criteria.setCostAllowed(false);//不需要產生費用
//第二個參數傳入false代表從沒打開的定位設備選取,為true則要從已經打開的定位設備中選取。
String bestProvider = manager.getBestProvider(criteria, false);
Log.d("data", ""+bestProvider);

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com