Android获取当前位置经纬度(非第三方地图集成)

Android获取当前位置经纬度(非第三方地图集成)


1 添加权限:

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

GPS定位模式权限需要第一个 网络定位模式下的权限需要第一个或者第二个


2 创建LocationManager 对象 用于管理Android的定位服务

   // 获取当前位置经纬度
        LocationManager locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);// 获取的是位置服务

3 指定LocationManager的定位方法 主要有两种方式:GPS定位和网络定位

GPS定位:更加精确,但更耗电,速度稍慢。

网络定位:提供的位置信息精度差,但速度较GPS定位要迅速 ,利用基站或WiFi访问的提供近似的位置信息。

Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

LocationManager.GPS_PROVIDER为GPS定位模式
LocationManager.NETWORK_PROVIDER为网络定位模式
这里可能会提示你若用户选择拒绝打开定位服务,则要加一个permission Check判断(动态访问权限)
alt+enter 去加即可 若用户拒绝,就会return


4 获取当前位置经纬度

double lat = location.getLatitude();//获取纬度
double lng = location.getLongitude();//获取经度

 private void getCurrentPosition() {
 LocationManager locationManager = (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) {
             // 申请权限 第一个为context 第二个可以指定多个请求的权限 第三个参数为请求码
             ActivityCompat.requestPermissions(this,
                     new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION},
                     GlobalVariable.ACCESS_LOCATION);
         }else {
             //获取所有可用的位置提供器
             List providers = locationManager.getProviders(true);
             String locationProvider;
             if(providers.contains(LocationManager.GPS_PROVIDER)){
                 //如果是GPS
                 locationProvider = LocationManager.GPS_PROVIDER;
             }else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
                 //如果是Network
                 locationProvider = LocationManager.NETWORK_PROVIDER;
             }else{
                 Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
                 return ;
             }
             // 调用getLastKnownLocation()方法获取当前的位置信息
             Location location = locationManager.getLastKnownLocation(locationProvider);
             if(location!=null) {
                 lat = location.getLatitude();//获取纬度
                 lng = location.getLongitude();//获取经度
                 LatLonPoint latLonPoint = new LatLonPoint(lat, lng);
                 // 地址逆解析
                 geocoderSearch = new GeocodeSearch(this);
                 geocoderSearch.setOnGeocodeSearchListener(this);
                 // 第一个参数表示一个Latlng(经纬度),第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
                 RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 10, GeocodeSearch.AMAP);
                 geocoderSearch.getFromLocationAsyn(query);
             }
         }
 }

实际测试中发现存在一些坑:
1 定位不准确 偏差较大
2 经常会有空指针情况出现
3 当未开启GPS 然后打开了GPS再重新调用 依旧不能获取当前位置
因为他是getLastKnownLocation
因此不推荐使用该方式
还是建议通过高德地图 或者百度地图去获取 当前位置的经纬度较准确!!!

你可能感兴趣的:(android)