Android GPS NETWORK定位

版权声明:转载请标明出处 https://blog.csdn.net/Android_man_me/article/details/84334991

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类中会有详细位置信息内容。

猜你喜欢

转载自blog.csdn.net/Android_man_me/article/details/84334991