关于Android自带的定位处理

工作需要这里对Android自带定位做个小小的记录,GPS测试过可用,网络的,需要再次测试,但是方式都差不多,简单总结如下。

1、首先需要添加权限

  <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!--网络权限-->
    <uses-permission android:name="android.permission.INTERNET" />

2、然后推荐在服务里做定位处理MyService可以继承Location网上很多,这里不再继承 LocationListener 了,继承的方法有很多上面有链接。

主要代码实现如下

要使用的参数

    private LocationManager mLocationManager;
    private Location mLocation;
    private double lat = 0;
    private double lng = 0;
    private double alt = 0;
    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 刷新距离10m
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 5; // 5 秒

onCreate方法里

 @Override
    public void onCreate() {
        super.onCreate();
        PDALogger.d("onCreate");
        ctx = PdaApplication.getInstance();
        getLocation();//读取手机端GPS
        mHandler.postDelayed(uploadGPSRunnable, 3000);
    }

下面是这个方法getLocation(),划线部分可要可不要

public Location getLocation() {
        mLocationManager = (LocationManager) ctx.getSystemService(LOCATION_SERVICE);
        // getting GPS status
        boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        // getting network status
        boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            }
            //get the location by gps
            if (isGPSEnabled) {
                if (mLocation == null) {
                    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mGPSLocationListener);
                    PDALogger.d("GPS Enabled");
                    if(mLocationManager!=null){
                        mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    }
                }
            } else if (isNetworkEnabled) {// First get location from Network Provider
                if(mLocation==null){
                    mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mNetWorkLocationListener);
                    PDALogger.d("Network");
                    if(mLocationManager!=null){
                        mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    }
                }
            }

        }
        return mLocation;
    }

这里是两个监听器GPS和网络的

/**
     * GPS定位监听器
     */
    public final LocationListener mGPSLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            updateToNewLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            updateToNewLocation(null);
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

    /**
     * 网络定位监听器
     */
    public final LocationListener mNetWorkLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            updateToNewLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            updateToNewLocation(null);
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

定位数据保存,划线处可不要

 /**
     * 定位数据随时保存
     * @param location
     * @return
     */
    private Location updateToNewLocation(Location location) {
        String latLongString;
        if (location != null) {
            lat = location.getLatitude();
            lng = location.getLongitude();
            alt = location.getAltitude();
             latLongString = "
纬度:" + lat + "
经度:" + lng + "
海拔:" + alt;
             PDALogger.d(latLongString);
            mLocation = mLocation;
        } else {
            PDALogger.d("无法获取地理信息,请稍后...");
        }
        return location;
    }

上面就是整个代码使用的方式了,下面是整个Service代码

package com.xvli.comm;

import android.Manifest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v4.app.ActivityCompat;

import com.xvli.application.PdaApplication;
import com.xvli.utils.PDALogger;

public class MyService extends Service {
    private Context ctx;
    private LocationManager mLocationManager;
    private Location mLocation;
    private double lat = 0;
    private double lng = 0;
    private double alt = 0;
    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 刷新距离10m
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 5; // 5 秒


    public MyService() {
    }

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    PDALogger.d("onCreate");
            }
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        PDALogger.d("onCreate");
        ctx = PdaApplication.getInstance();
        getLocation();//读取手机端GPS
        mHandler.postDelayed(uploadGPSRunnable, 3000);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        PDALogger.d("onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        PDALogger.d("onDestroy");
        if (uploadGPSRunnable != null) {
            mHandler.removeCallbacks(uploadGPSRunnable);
        }

        //=================================
        //关闭定位监听器
        if (mLocationManager != null) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            mLocationManager.removeUpdates(mGPSLocationListener);
            mLocationManager.removeUpdates(mNetWorkLocationListener);
            mLocationManager = null;
        }

    }

    @Override
    public boolean onUnbind(Intent intent) {
        PDALogger.d("onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onRebind(Intent intent) {
        PDALogger.d("onRebind");
        super.onRebind(intent);
    }
//============================================================================
    Runnable uploadGPSRunnable = new Runnable() {
        @Override
        public void run() {
            PDALogger.d("这里上传GPS:经度:"+lat+",维度:"+lng+",海拔:"+alt);
            mHandler.postDelayed(this, Config.GPSTIME * 1000);
        }
    };

    /**
     * GPS定位监听器
     */
    public final LocationListener mGPSLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            updateToNewLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            updateToNewLocation(null);
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

    /**
     * 网络定位监听器
     */
    public final LocationListener mNetWorkLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            updateToNewLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            updateToNewLocation(null);
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

    /**
     * 定位数据随时保存
     * @param location
     * @return
     */
    private Location updateToNewLocation(Location location) {
        String latLongString;
        if (location != null) {
            lat = location.getLatitude();
            lng = location.getLongitude();
            alt = location.getAltitude();
             latLongString = "
纬度:" + lat + "
经度:" + lng + "
海拔:" + alt;
             PDALogger.d(latLongString);
            mLocation = mLocation;
        } else {
            PDALogger.d("无法获取地理信息,请稍后...");
        }
        return location;
    }


    public Location getLocation() {
        mLocationManager = (LocationManager) ctx.getSystemService(LOCATION_SERVICE);
        // getting GPS status
        boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        // getting network status
        boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            }
            //get the location by gps
            if (isGPSEnabled) {
                if (mLocation == null) {
                    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mGPSLocationListener);
                    PDALogger.d("GPS Enabled");
                    if(mLocationManager!=null){
                        mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    }
                }
            } else if (isNetworkEnabled) {// First get location from Network Provider
                if(mLocation==null){
                    mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, mNetWorkLocationListener);
                    PDALogger.d("Network");
                    if(mLocationManager!=null){
                        mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    }
                }
            }

        }
        return mLocation;
    }

}
View Code
原文地址:https://www.cnblogs.com/bxfx111/p/5091061.html