android典型程式碼系列(十六)------GPS定位

fandong12388發表於2015-12-04

13GPS定位 :

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.text.TextUtils;
/** * 保證這個類只存在一個例項 */
public class GPSInfoProvider {
    LocationManager manager;
    private static GPSInfoProvider mGPSInfoProvider;
    private static Context context;
    private static MyLoactionListener listener;
  //1.私有化構造方法
    private GPSInfoProvider(){};
 //2. 提供一個靜態的方法,可以返回他的一個例項(synchronized:保證這個方法裡面的邏輯必須全部執行)
    public static synchronized GPSInfoProvider getInstance(Context context){
        if(mGPSInfoProvider==null){
            mGPSInfoProvider = new GPSInfoProvider();
            GPSInfoProvider.context = context;
        }
        return mGPSInfoProvider;
    }
    // 3.獲取gps 資訊 
    public String getLocation(){
        manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        //manager.getAllProviders();//獲取當前手機支援的定位方式
        String provider = getProvider(manager);
        /* 註冊位置的監聽器 
第一個引數:定位方式,GPS,AGPS,基站
第二個引數:每隔多長時間(ms)獲取一下當前手機的位置(推薦1分鐘)
第三個引數:位置每改變多少米獲取一下位置資訊
第四個引數:當位置發生改變的時候所對應的的回撥方法
*/
        manager.requestLocationUpdates(provider,60000, 50, getListener());
        SharedPreferences sp = context.getSharedPreferences
("config", Context.MODE_PRIVATE);
        String location = sp.getString("location", "");
        return location;
    }
/** @param manager 位置管理服務
     * @return 最好的位置提供者*/
    private String getProvider(LocationManager manager){
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);//經度,這裡表示精準定位
        criteria.setAltitudeRequired(false);//是否對海拔資訊敏感
        criteria.setPowerRequirement(Criteria.POWER_MEDIUM);//設定GPS定位對耗電效能要求
        criteria.setSpeedRequired(true);//設定是否對速度的變化敏感
        criteria.setCostAllowed(true);//true:允許產生一些開銷,與執行商通訊等
        //第一個引數:一組查詢條件,耗電?經緯度?海拔等
        //第二個引數:true:返回那些已經被開啟的裝置,false:返回全部可以的位置提供者
        return  manager.getBestProvider(criteria, true);
    }
    private synchronized MyLoactionListener getListener(){
        if(listener==null){
            listener = new MyLoactionListener();
        }
        return listener;
    }
    private class MyLoactionListener implements LocationListener{
        /**當手機位置發生改變的時候 呼叫的方法 */
        public void onLocationChanged(Location location) {
            String latitude ="latitude "+ location.getLatitude(); //緯度
            String longtitude = "longtitude "+ location.getLongitude(); //經度
            SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
            Editor editor = sp.edit();
            editor.putString("location", latitude+" - "+ longtitude);
            editor.commit(); //最後一次獲取到的位置資訊 存放到sharedpreference裡面
        }
        /**某一個裝置的狀態發生改變的時候 呼叫 可用->不可用  不可用->可用*/
        public void onStatusChanged(String provider, int status, Bundle extras) {   }
        /**某個裝置被開啟*/
        public void onProviderEnabled(String provider) {}
        /**某個裝置被禁用 */
        public void onProviderDisabled(String provider) {}
    }
// 4. 停止gps監聽(很重要)
    public void stopGPSListener(){
        manager.removeUpdates(getListener());
    }
}

補充:

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE);//設定為最大精度 
criteria.setAltitudeRequired(false);//不要求海拔資訊 
criteria.setBearingRequired(false);//不要求方位資訊 
criteria.setCostAllowed(true);//是否允許付費 
criteria.setPowerRequirement(Criteria.POWER_LOW);//對電量的要求 

它其實是一個條件設定是選擇provider的用的
String provider = locationManager.getBestProvider(criteria, true);這個方法是根據你設定的條件找到的最優的provider
你要是想用network定位你就要改變這個設定條件 或者 直接用設定provider為network型別的了

補充說明:
LocationManager.GPS_PROVIDER:GPS,精度比較高,但是慢而且消耗電力,而且可能因為天氣原因或者障礙物而無法獲取衛星資訊,另外裝置可能沒有GPS模組;
LocationManager.NETWORK_PROVIDER:通過網路獲取定位資訊,精度低,耗電少,獲取資訊速度較快,不依賴GPS模組。

相關文章