定位可以通过v7的LocationManager获取,还可以使用百度、高德等sdk获取定位。

权限配置

|权限 |用途| | - |- | |ACCESS_COARSE_LOCATION|用于进行网络定位| |ACCESS_FINE_LOCATION| 用于访问GPS定位。| |INTERNET|允许应用可以访问网络。|

通过v7的LocationManager获取

 LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
 LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(final Location location) {
                if (location == null) {
                    return;
                }
				//定位回调
               
            }

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

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }
        };
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, locationListener);

定位完成后记得销毁,释放资源。 lm.removeUpdates(locationListener);

高德定位

初始化定位

//初始化定位
AMapLocationClient mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(5000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();

监听定位

  @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        super.onLocationChanged(aMapLocation);
        if (aMapLocation != null) {
            if (aMapLocation.getErrorCode() == 0) {
			} else {
                showToast(LocationError.getError(aMapLocation.getErrorCode()));
            }
		}
	}

错误码监听

public class LocationError {

    @SuppressLint("UseSparseArrays")
    private static Map<Integer, String> list = new HashMap<>();

    static {
        list.put(0, "定位成功");
        list.put(1, "一些重要参数为空,如context。");
        list.put(2, "定位失败,由于仅扫描到单个wifi,且没有基站信息。");
        list.put(3, "获取到的请求参数为空,可能获取过程中出现异常。");
        list.put(4, "请求服务器过程中的异常,多为网络情况差,链路不通导致");
        list.put(5, "请求被恶意劫持,定位结果解析失败。");
        list.put(6, "定位服务返回定位失败。");
        list.put(7, "KEY鉴权失败。");
        list.put(8, "Android exception常规错误");
        list.put(9, "定位初始化时出现异常。");
        list.put(10, "定位客户端启动失败。");
        list.put(11, " 请检查是否安装SIM卡,设备很有可能连入了伪基站网络。");
        list.put(12, "缺少定位权限。");
        list.put(13, "定位失败,由于未获得WIFI列表和基站信息,且GPS当前不可用。");
        list.put(14, "GPS 定位失败,由于设备当前 GPS 状态差。");
        list.put(15, "定位结果被模拟导致定位失败。");
        list.put(16, "当前POI检索条件、行政区划检索条件下,无可用地理围栏");
        list.put(17, "未知错误");
        list.put(18, "定位失败,由于手机WIFI功能被关闭同时设置为飞行模式");
        list.put(19, "定位失败,由于手机没插sim卡且WIFI功能被关闭");


    }

    public static String getError(int id) {
        if (list.size() > id)
            return list.get(id);
        else
            return "定位失败";
    }

}