Android GPS定位(獲取經緯度)


簡述:

    android 定位一般有四種方法,這四種方式分別是:GPS定位,WIFI定位,基站定位,AGPS定位。

本篇博文主要記錄一下GPS定位:這種方式需要手機支持GPS模塊硬件支持。通過GPS方式准確度是最高的,但是它的缺點也非常明顯:

                    1、比較耗電;

                    2、絕大部分用戶默認不開啟GPS模塊;

                    3、從GPS模塊啟動到獲取第一次定位數據,可能需要比較長的時間;

                    4、室內幾乎無法使用。

這其中,缺點2,3都是比較致命的。

GPS定位優點:GPS走的是衛星通信的通道,在沒有網絡連接的情況下也能使用。

GPS定位:

    相關類

        (1)、LocationManager:位置服務管理器類
是獲取位置信息的入口級類,要獲取位置信息,首先需要獲取一個LocationManger對象:                  

 

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

        (2)、LocationProvider:位置源提供者
用於描述位置提供者信息,可以先使用方法獲取最佳提供者的名稱:

String providerName = LocationManger.getBestProvider(Criteria criteria, boolean enabledOnly);  

                         LocationManger.getProvider(String name)獲取LocationProvider對象。

        (3)、Location:位置對象
                        描述地理位置信息的類,記錄了經緯度、海拔高度、獲取坐標時間、速度、方位等。可以通過LocationManager.getLastKnowLocation(provider)獲取位置坐標,provider就是上文中提到的GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER、FUSED_PROVIDER;不過很多時候得到的Location對象為null;實時動態坐標可以在監聽器locationListener的onLocationChanged(Location location)方法中來獲取。

        (4)、LocationListener:位置監聽接口
用於監聽位置(包括GPS、網絡、基站等所有提供位置的)變化,監聽設備開關與狀態。實時動態獲取位置信息,首先要實現該接口,在相關方法中添加實現功能的代碼,實現該接口可以使用內部類或者匿名實現。然后注冊監聽:LocationManger.requestLocationUpdates(Stringprovider, long minTime, float minDistance, LocationListener listener)。使用完之后需要在適當的位置移除監聽:LocationManager .removeUpdates(LocationListener listener)。LocationListener需要實現的方法:
onLocationChanged(Locationlocation):當位置發生變化的時候會自動調用該方法,參數location記錄了最新的位置信息。
onStatusChanged(String provider, int status, Bundle extras):當位置提供者的狀態發生改變(可用到不可用、不可用到可用)時自動調用該方法;參數provider為位置提供者的名稱,status為狀態信息:OUT_OF_SERVICE 、AVAILABLE 、TEMPORARILY_UNAVAILABLE ,extras為附加數據:key/value,如satellites;
onProviderEnabled(String provider):位置信息提供者可用時自動調用,比如用戶關閉了GPS時,provider則為“gps”;
onProviderDisabled(String provider):位置信息不可用時自動調用。

        (5)、Criteria:用於選擇位置信息提供者的輔助類
創建LocationProvider對象時會使用到該類,參考上文中內容。定位信息提供者會根據精度、電量、是否提供高度、速度、方位、服務商付費等信息進行排序選擇定位提供者。 可以參考一個示例:

 
/** this criteria needs high accuracy, high power and cost */  
 public static Criteria createFineCriteria() {  
  
    Criteriac = new Criteria();  
    c.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
    c.setAltitudeRequired(true);//包含高度信息  
    c.setBearingRequired(true);//包含方位信息  
    c.setSpeedRequired(true);//包含速度信息  
    c.setCostAllowed(true);//允許付費  
    c.setPowerRequirement(Criteria.POWER_HIGH);//高耗電  
    return c;  
 }  

 

         (6)、GpsStatus.Listener:GPS狀態監聽的一個接口

                       使用方法與locationListener接口類似,先實現接口並創建對象,實現接口中的方法:onGpsStatusChanged(int event);在方法中實現對衛星狀態信息變化的監聽,根據event的類型編寫邏輯代碼。創建對象后再注冊監聽:LocationManager .addGpsStatusListener(GpsStatus.Listener listener);使用后在合適的位置釋放監聽:LocationManager .removeGpsStatusListener(GpsStatus.Listener listener)。

    GPS定位流程

          (1)配置權限:

                添加如下權限:

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

  (2)獲取LocationManager類型對象:     

LocationManager mLocationManager =(LocationManager) mContext.getSystemService (Context.LOCATION_SERVICE);   

             (3) 獲取最佳位置定位方式pProvider:(這步可有可無,根據情況而定)

 

       mLocationManager.getBestProvider(mCriteria,true); mCriteria為Criteria類型的對象,包含精度、是否返回高度、方位、速度等信息。創建Criteria對象示例:

/** this criteria needs highaccuracy, high power, and cost */  
   public static CriteriacreateFineCriteria() {  
   
      Criteriac = new Criteria();  
      c.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
      c.setAltitudeRequired(true);//包含高度信息  
      c.setBearingRequired(true);//包含方位信息  
      c.setSpeedRequired(true);//包含速度信息  
      c.setCostAllowed(true);//允許付費  
      c.setPowerRequirement(Criteria.POWER_HIGH);//高耗電  
      return c;  
   }

     (4) 實現LocationListener接口:可以采用內部類(MyLocationListener)或匿名類方式實現,重寫接口方法.

             (5) 創建MyLocationListener對象mLocationListener,並添加監聽:

  mLocationListener =new MyLocationListener();  

mLocationManager.requestLocationUpdates(pProvider, MIN_TIME_UPDATE,MIN_DISTANCE_UPDATE, mLocationListener);  

             (6) 使用完釋放監聽:

mLocationManager.removeUpdates(mLocationListener);  

該方法執行的位置需要特別注意,如果是在Activity對象中,則需要考慮Activity的生命周期,onPause方法中比較合適,因為onStop、onDestroy兩個方法在異常情況下不會被執行。
              (7) 如果需要監聽GPS衛星狀態,則需要實現GpsStatus.Listener接口,並創建對象、添加監聽、使用完后釋放監聽:

實現接口:

private class MyGpsStatusListener implements GpsStatus.Listener;  

創建對象:

MyGpsStatusListener mGpsStatusListener = new MyGpsStatusListener();  

添加監聽:

mLocationManager.addGpsStatusListener (mGpsStatusListener;  

釋放監聽:      

mLocationManager.removeGpsStatusListener(mGpsStatusListener);  

    案例實現:

全部代碼貼出來:

package com.lzy.gpslocation;  
  
import android.Manifest;  
import android.content.Context;  
import android.content.Intent;  
import android.content.pm.PackageManager;  
import android.location.Criteria;  
import android.location.Location;  
import android.location.LocationListener;  
import android.location.LocationManager;  
import android.location.LocationProvider;  
import android.support.annotation.NonNull;  
import android.support.v4.app.ActivityCompat;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.Button;  
import android.widget.TextView;  
import android.widget.Toast;  
  
import com.fastaccess.permission.base.PermissionHelper;  
import com.fastaccess.permission.base.callback.OnPermissionCallback;  
  
import java.util.Arrays;  
  
public class MainActivity extends AppCompatActivity implements OnPermissionCallback {  
    private static final String TAG = MainActivity.class.getSimpleName();  
    private static final String GPS_LOCATION_NAME = android.location.LocationManager.GPS_PROVIDER;  
    private static final int REQUEST_PRESSMION_CODE = 10000;  
    private final static String[] MULTI_PERMISSIONS = new String[]{  
            Manifest.permission.ACCESS_COARSE_LOCATION,  
            Manifest.permission.ACCESS_FINE_LOCATION};  
  
    private LocationManager locationManager;  
    private boolean isGpsEnabled;  
    private String locateType;  
    private TextView textLocationShow;  
    private Button btnLocation;  
  
    //權限檢測類  
    private PermissionHelper mPermissionHelper;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        initData();  
        initViews();  
    }  
  
    /**  
     * 方法描述:初始化定位相關數據  
     */  
    private void initData() {  
        //獲取定位服務  
        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  
        //判斷是否開啟GPS定位功能  
        isGpsEnabled = locationManager.isProviderEnabled(GPS_LOCATION_NAME);  
        //定位類型:GPS  
        locateType = locationManager.GPS_PROVIDER;  
        //初始化PermissionHelper  
        mPermissionHelper = PermissionHelper.getInstance(MainActivity.this);  
    }  
  
    /**  
     * 方法描述:初始化View組件信息及相關點擊事件  
     */  
    private void initViews() {  
        textLocationShow = (TextView) findViewById(R.id.text_location_show);  
        btnLocation = (Button) findViewById(R.id.btn_location);  
  
        btnLocation.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                getLocation();  
            }  
        });  
  
        ((Button)findViewById(R.id.btn_skip)).setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Intent intent = new Intent(MainActivity.this,ThirdActivity.class);  
                startActivity(intent);  
            }  
        });  
    }  
  
    private void getLocation() {  
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)  
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission  
                (MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)  
                != PackageManager.PERMISSION_GRANTED) {  
            mPermissionHelper.request(MULTI_PERMISSIONS);  
            return;  
        }  
        Location location = locationManager.getLastKnownLocation(locateType); // 通過GPS獲取位置  
        if (location != null) {  
            updateUI(location);  
        }  
        // 設置監聽*器,自動更新的最小時間為間隔N秒(1秒為1*1000,這樣寫主要為了方便)或最小位移變化超過N米  
        locationManager.requestLocationUpdates(locateType, 100,0,  
                locationListener);  
    }  
  
    private LocationListener locationListener = new LocationListener() {  
        /**  
         * 位置信息變化時觸發:當坐標改變時觸發此函數,如果Provider傳進相同的坐標,它就不會被觸發  
         * @param location  
         */  
        @Override  
        public void onLocationChanged(Location location) {  
            Toast.makeText(MainActivity.this, "onLocationChanged函數被觸發!", Toast.LENGTH_SHORT).show();  
            updateUI(location);  
            Log.i(TAG, "時間:" + location.getTime());  
            Log.i(TAG, "經度:" + location.getLongitude());  
            Log.i(TAG, "緯度:" + location.getLatitude());  
            Log.i(TAG, "海拔:" + location.getAltitude());  
        }  
  
        /**  
         * GPS狀態變化時觸發:Provider被disable時觸發此函數,比如GPS被關閉  
         * @param provider  
         * @param status  
         * @param extras  
         */  
        @Override  
        public void onStatusChanged(String provider, int status, Bundle extras) {  
            switch (status) {  
                //GPS狀態為可見時  
                case LocationProvider.AVAILABLE:  
                    Toast.makeText(MainActivity.this, "onStatusChanged:當前GPS狀態為可見狀態", Toast.LENGTH_SHORT).show();  
                    break;  
                //GPS狀態為服務區外時  
                case LocationProvider.OUT_OF_SERVICE:  
                    Toast.makeText(MainActivity.this, "onStatusChanged:當前GPS狀態為服務區外狀態", Toast.LENGTH_SHORT).show();  
                    break;  
                //GPS狀態為暫停服務時  
                case LocationProvider.TEMPORARILY_UNAVAILABLE:  
                    Toast.makeText(MainActivity.this, "onStatusChanged:當前GPS狀態為暫停服務狀態", Toast.LENGTH_SHORT).show();  
                    break;  
            }  
        }  
  
        /**  
         * 方法描述:GPS開啟時觸發  
         * @param provider  
         */  
        @Override  
        public void onProviderEnabled(String provider) {  
            Toast.makeText(MainActivity.this, "onProviderEnabled:方法被觸發", Toast.LENGTH_SHORT).show();  
            getLocation();  
        }  
  
        /**  
         * 方法描述: GPS禁用時觸發  
         * @param provider  
         */  
        @Override  
        public void onProviderDisabled(String provider) {  
  
        }  
    };  
  
    /**  
     * 方法描述:在View上更新位置信息的顯示  
     *  
     * @param location  
     */  
    private void updateUI(Location location) {  
        double longitude = location.getLongitude();  
        double latitude = location.getLatitude();  
  
        textLocationShow.setText("當前經度:" + longitude + "\n當前緯度:" + latitude);  
    }  
  
    @Override  
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);  
    }  
  
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        mPermissionHelper.onActivityForResult(requestCode);  
    }  
  
    @Override  
    public void onPermissionGranted(@NonNull String[] permissionName) {  
        getLocation();  
        Log.i("onPermissionGranted", "Permission(s) " + Arrays.toString(permissionName) + " Granted");  
    }  
  
    @Override  
    public void onPermissionDeclined(@NonNull String[] permissionName) {  
  
    }  
  
    @Override  
    public void onPermissionPreGranted(@NonNull String permissionsName) {  
  
    }  
  
    @Override  
    public void onPermissionNeedExplanation(@NonNull String permissionName) {  
  
    }  
  
    @Override  
    public void onPermissionReallyDeclined(@NonNull String permissionName) {  
  
    }  
  
    @Override  
    public void onNoPermissionNeeded() {  
  
    }  
}  

代碼封裝:

     高效的開發者絕對不會做重復的代碼的事情。那么可以編寫一個GPS定位管理類,將公共的功能邏輯封裝好實現模塊化,在activity中實現差異化的內容。   

    1、GPSLocationListener:利用Java面向接口編程的方式定義該接口用於實時監聽數據回調

import android.location.Location;  
import android.os.Bundle;  
  
/**  
 * 類描述:供外部實現的接口  
 * Created by lizhenya on 2016/9/12.  
 */  
public interface GPSLocationListener {  
    /**  
     * 方法描述:位置信息發生改變時被調用  
     *  
     * @param location 更新位置后的新的Location對象  
     */  
    void UpdateLocation(Location location);  
  
    /**  
     * 方法描述:provider定位源類型變化時被調用  
     *  
     * @param provider provider的類型  
     * @param status   provider狀態  
     * @param extras   provider的一些設置參數(如高精度、低功耗等)  
     */  
    void UpdateStatus(String provider, int status, Bundle extras);  
  
    /**  
     * 方法描述:GPS狀態發生改變時被調用(GPS手動啟動、手動關閉、GPS不在服務區、GPS占時不可用、GPS可用)  
     *  
     * @param gpsStatus 詳見{@link GPSProviderStatus}  
     */  
    void UpdateGPSProviderStatus(int gpsStatus);  
} 

 2、GPSLocation:實現動態地實時更新位置坐標信息、狀態信息

import android.location.Location;  
import android.location.LocationListener;  
import android.location.LocationProvider;  
import android.os.Bundle;  
  
/**  
 * 類描述:實現LocationListener的子類,同時實現自己的接口調用  
 * Created by lizhenya on 2016/9/12.  
 */  
public class GPSLocation implements LocationListener {  
    private GPSLocationListener mGpsLocationListener;  
  
    public GPSLocation(GPSLocationListener gpsLocationListener) {  
        this.mGpsLocationListener = gpsLocationListener;  
    }  
  
    @Override  
    public void onLocationChanged(Location location) {  
        if (location != null) {  
            mGpsLocationListener.UpdateLocation(location);  
        }  
    }  
  
  
    @Override  
    public void onStatusChanged(String provider, int status, Bundle extras) {  
        mGpsLocationListener.UpdateStatus(provider, status, extras);  
        switch (status) {  
            case LocationProvider.AVAILABLE:  
                mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_AVAILABLE);  
                break;  
            case LocationProvider.OUT_OF_SERVICE:  
                mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_OUT_OF_SERVICE);  
                break;  
            case LocationProvider.TEMPORARILY_UNAVAILABLE:  
                mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_TEMPORARILY_UNAVAILABLE);  
                break;  
        }  
    }  
  
    @Override  
    public void onProviderEnabled(String provider) {  
        mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_ENABLED);  
    }  
  
    @Override  
    public void onProviderDisabled(String provider) {  
        mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_DISABLED);  
    }  
}  

3、GPS狀態信息類

/**  
 * 類描述:GPS狀態類  
 * Created by lizhenya on 2016/9/12.  
 */  
public class GPSProviderStatus {  
    //用戶手動開啟GPS  
    public static final int GPS_ENABLED = 0;  
    //用戶手動關閉GPS  
    public static final int GPS_DISABLED = 1;  
    //服務已停止,並且在短時間內不會改變  
    public static final int GPS_OUT_OF_SERVICE = 2;  
    //服務暫時停止,並且在短時間內會恢復  
    public static final int GPS_TEMPORARILY_UNAVAILABLE = 3;  
    //服務正常有效  
    public static final int GPS_AVAILABLE = 4;  
}  

4、GPSLocationManager:實現GPS定位的初始化、GPS定位的啟動和終止

import android.Manifest;  
import android.app.Activity;  
import android.content.Context;  
import android.content.Intent;  
import android.content.pm.PackageManager;  
import android.location.Location;  
import android.location.LocationManager;  
import android.os.Build;  
import android.provider.Settings;  
import android.support.v4.app.ActivityCompat;  
import android.widget.Toast;  
  
import java.lang.ref.WeakReference;  
  
/**  
 * 類描述:GPS定位的管理類  
 * Created by lizhenya on 2016/9/12.  
 */  
public class GPSLocationManager {  
    private static final String GPS_LOCATION_NAME = android.location.LocationManager.GPS_PROVIDER;  
    private static GPSLocationManager gpsLocationManager;  
    private static Object objLock = new Object();  
    private boolean isGpsEnabled;  
    private static String mLocateType;  
    private WeakReference<Activity> mContext;  
    private LocationManager locationManager;  
    private GPSLocation mGPSLocation;  
    private boolean isOPenGps;  
    private long mMinTime;  
    private float mMinDistance;  
  
    private GPSLocationManager(Activity context) {  
        initData(context);  
    }  
  
    private void initData(Activity context) {  
        this.mContext = new WeakReference<>(context);  
        if (mContext.get() != null) {  
            locationManager = (LocationManager) (mContext.get().getSystemService(Context.LOCATION_SERVICE));  
        }  
        //定位類型:GPS  
        mLocateType = locationManager.GPS_PROVIDER;  
        //默認不強制打開GPS設置面板  
        isOPenGps = false;  
        //默認定位時間間隔為1000ms  
        mMinTime = 1000;  
        //默認位置可更新的最短距離為0m  
        mMinDistance = 0;  
    }  
  
    public static GPSLocationManager getInstances(Activity context) {  
        if (gpsLocationManager == null) {  
            synchronized (objLock) {  
                if (gpsLocationManager == null) {  
                    gpsLocationManager = new GPSLocationManager(context);  
                }  
            }  
        }  
        return gpsLocationManager;  
    }  
  
    /**  
     * 方法描述:設置發起定位請求的間隔時長  
     *  
     * @param minTime 定位間隔時長(單位ms)  
     */  
    public void setScanSpan(long minTime) {  
        this.mMinTime = minTime;  
    }  
  
    /**  
     * 方法描述:設置位置更新的最短距離  
     *  
     * @param minDistance 最短距離(單位m)  
     */  
    public void setMinDistance(float minDistance) {  
        this.mMinDistance = minDistance;  
    }  
  
    /**  
     * 方法描述:開啟定位(默認情況下不會強制要求用戶打開GPS設置面板)  
     *  
     * @param gpsLocationListener  
     */  
    public void start(GPSLocationListener gpsLocationListener) {  
        this.start(gpsLocationListener, isOPenGps);  
    }  
  
    /**  
     * 方法描述:開啟定位  
     *  
     * @param gpsLocationListener  
     * @param isOpenGps           當用戶GPS未開啟時是否強制用戶開啟GPS  
     */  
    public void start(GPSLocationListener gpsLocationListener, boolean isOpenGps) {  
        this.isOPenGps = isOpenGps;  
        if (mContext.get() == null) {  
            return;  
        }  
        mGPSLocation = new GPSLocation(gpsLocationListener);  
        isGpsEnabled = locationManager.isProviderEnabled(GPS_LOCATION_NAME);  
        if (!isGpsEnabled && isOPenGps) {  
            openGPS();  
            return;  
        }  
        if (ActivityCompat.checkSelfPermission(mContext.get(), Manifest.permission.ACCESS_FINE_LOCATION)  
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission  
                (mContext.get(), Manifest.permission.ACCESS_COARSE_LOCATION)  
                != PackageManager.PERMISSION_GRANTED) {  
            return;  
        }  
  
        Location lastKnownLocation = locationManager.getLastKnownLocation(mLocateType);  
        mGPSLocation.onLocationChanged(lastKnownLocation);  
        //備注:參數2和3,如果參數3不為0,則以參數3為准;參數3為0,則通過時間來定時更新;兩者為0,則隨時刷新  
        locationManager.requestLocationUpdates(mLocateType, mMinTime, mMinDistance, mGPSLocation);  
    }  
  
    /**  
     * 方法描述:轉到手機設置界面,用戶設置GPS  
     */  
    public void openGPS() {  
        Toast.makeText(mContext.get(), "請打開GPS設置", Toast.LENGTH_SHORT).show();  
        if (Build.VERSION.SDK_INT > 15) {  
            Intent intent = new Intent(  
                    Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
            mContext.get().startActivityForResult(intent, 0);  
        }  
    }  
  
    /**  
     * 方法描述:終止GPS定位,該方法最好在onPause()中調用  
     */  
    public void stop() {  
        if (mContext.get() != null) {  
            if (ActivityCompat.checkSelfPermission(mContext.get(), Manifest.permission.ACCESS_FINE_LOCATION) !=  
                    PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext.get(),  
                    Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {  
                return;  
            }  
            locationManager.removeUpdates(mGPSLocation);  
        }  
    }  
}  

GPS管理類的使用:在Activity中Oncreate()方法中進行初始化和開啟定位,在onPause()方法中終止定位

import android.app.Activity;  
import android.location.Location;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.Button;  
import android.widget.TextView;  
import android.widget.Toast;  
  
import com.lzy.gpslocation.location.GPSLocationListener;  
import com.lzy.gpslocation.location.GPSLocationManager;  
import com.lzy.gpslocation.location.GPSProviderStatus;  
  
/**  
 * Created by lizhenya on 2016/9/12.  
 */  
public class ThirdActivity extends Activity {  
    private TextView text_gps_3;  
    private Button btn_gps_3;  
  
    private GPSLocationManager gpsLocationManager;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_third);  
  
        initData();  
    }  
  
    private void initData() {  
        gpsLocationManager = GPSLocationManager.getInstances(ThirdActivity.this);  
  
        text_gps_3 = (TextView) findViewById(R.id.text_gps_3);  
        btn_gps_3 = (Button) findViewById(R.id.btn_gps_3);  
        btn_gps_3.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                //開啟定位  
                gpsLocationManager.start(new MyListener());  
            }  
        });  
    }  
  
    class MyListener implements GPSLocationListener {  
  
        @Override  
        public void UpdateLocation(Location location) {  
            if (location != null) {  
                text_gps_3.setText("經度:" + location.getLongitude() + "\n緯度:" + location.getLatitude());  
            }  
        }  
  
        @Override  
        public void UpdateStatus(String provider, int status, Bundle extras) {  
            if ("gps" == provider) {  
                Toast.makeText(ThirdActivity.this, "定位類型:" + provider, Toast.LENGTH_SHORT).show();  
            }  
        }  
  
        @Override  
        public void UpdateGPSProviderStatus(int gpsStatus) {  
            switch (gpsStatus) {  
                case GPSProviderStatus.GPS_ENABLED:  
                    Toast.makeText(ThirdActivity.this, "GPS開啟", Toast.LENGTH_SHORT).show();  
                    break;  
                case GPSProviderStatus.GPS_DISABLED:  
                    Toast.makeText(ThirdActivity.this, "GPS關閉", Toast.LENGTH_SHORT).show();  
                    break;  
                case GPSProviderStatus.GPS_OUT_OF_SERVICE:  
                    Toast.makeText(ThirdActivity.this, "GPS不可用", Toast.LENGTH_SHORT).show();  
                    break;  
                case GPSProviderStatus.GPS_TEMPORARILY_UNAVAILABLE:  
                    Toast.makeText(ThirdActivity.this, "GPS暫時不可用", Toast.LENGTH_SHORT).show();  
                    break;  
                case GPSProviderStatus.GPS_AVAILABLE:  
                    Toast.makeText(ThirdActivity.this, "GPS可用啦", Toast.LENGTH_SHORT).show();  
                    break;  
            }  
        }  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        //在onPause()方法終止定位  
        gpsLocationManager.stop();  
    }  
}  

OK,關於GPS定位獲取經緯度的總結先這么多。

源碼下載:Android GPS定位(獲取經緯度)

 

https://blog.csdn.net/u012810020/article/details/52517976


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM