1. 程式人生 > >Android GPS NETWORK定位

Android GPS NETWORK定位

Android 定位

定位所需許可權:

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

LocationManager:

LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);

Location Provider:

android系統存在多種provider

1)GPS_PROVIDER: 手機裡有GPS晶片,然後利用該晶片就能利用衛星獲得自己的位置資訊。 第一次時間慢,但定位精準

2)NETWORK_PROVIDER:利用網路定位,一般是利用手機基站和WIFI節點的地址來大致定位位置

3)PASSIVE_PROVIDER: 被動定位方式。這個意思也比較明顯。就是用現成的,當其它應用使用定位更新了定位資訊。系統會儲存下來。該應用接收到訊息後直接讀取就能夠了

    /**
     * 判斷裝置 具備哪種定位provider
     * <p>
     * 優先採用 netWork
     * <p>
     * GPS 耗時耗電
     *
     * @param locationManager
     * @return
     */
    private String judgeProvider(LocationManager locationManager) {

        List<String> prodiverlist = locationManager.getProviders(true);

        if (prodiverlist.contains(LocationManager.NETWORK_PROVIDER)) {
            return LocationManager.NETWORK_PROVIDER;//網路定位
        } else if (prodiverlist.contains(LocationManager.GPS_PROVIDER)) {
            return LocationManager.GPS_PROVIDER;//GPS定位 (返回時間較長 第一次可能2-5分鐘)
        }
        return null;
    }

獲取定位資訊

    /**
     * 獲取定位資訊
     *
     * @return
     */
    @SuppressLint("MissingPermission")
    public void getLocationInfo(Context context) {
        manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        if (null != manager) {
            String provider = judgeProvider(manager);
            if (null != provider) {
                /**
                 * 間隔時間 60 * 60 * 1000 ms
                 * 間隔位置 1000 m
                 *
                 * @param minTime minimum time interval between location updates, in milliseconds
                 * @param minDistance minimum distance between location updates, in meters
                 */
                manager.requestLocationUpdates(provider, 60 * 60 * 1000, 1000, locationListener);
            }
        }
    }


    private LocationListener locationListener = new LocationListener() {

        /**
         * 位置資訊變化時觸發
         * @param location
         */
        @Override
        public void onLocationChanged(Location location) {

            Log.i(TAG, "時間:" + location.getTime());
            Log.i(TAG, "經度:" + location.getLongitude());
            Log.i(TAG, "緯度:" + location.getLatitude());
            Log.i(TAG, "海拔:" + location.getAltitude());

            //解析具體詳細位置資訊
            if (null != location) {
                getAddress(location);
            }
        }

        /**
         * GPS狀態變化時觸發
         * @param provider
         * @param status
         * @param extras
         */
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
                //GPS狀態為可見時
                case LocationProvider.AVAILABLE:
                    Log.i(TAG, "當前GPS狀態為可見狀態");
                    break;
                //GPS狀態為服務區外時
                case LocationProvider.OUT_OF_SERVICE:
                    Log.i(TAG, "當前GPS狀態為服務區外狀態");
                    break;
                //GPS狀態為暫停服務時
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    Log.i(TAG, "當前GPS狀態為暫停服務狀態");
                    break;
            }
        }

        /**
         * GPS開啟時觸發
         */
        @Override
        public void onProviderEnabled(String provider) {

        }

        /**
         * GPS禁用時觸發
         */
        @Override
        public void onProviderDisabled(String provider) {

        }
    };

獲取到Location之後,根據經緯度解析出詳細的位置資訊:

    /**
     * 獲取定位 詳細資訊
     *
     * @param location
     * @return
     */
    private List<Address> getAddress(Location location) {

        List<Address> result = null;
        try {
            if (location != null) {
                Geocoder gc = new Geocoder(context, Locale.getDefault());
                result = gc.getFromLocation(location.getLatitude(),
                        location.getLongitude(), 1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return result;
    }

在Address類中會有詳細位置資訊內容。