Android原生方式获取经纬度
两种定位方式:GPS定位、WiFi定位
优劣:

  如果项目定位要求较高还是建议使用三方地图库

GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴毙无法使用
WiFi定位没有室内外限制也不需要开启GPS但需要联网,另外测试发现WiFi定位时onLocati d函数(用于监听经纬度变化)触发间隔无法小于30s
   下面是Wifi定位的代码

public class GPSActivity extends AppCompatActivity {

public static final int LOCATION_CODE = 301;private LocationManager locationManager;private String locationProvider = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    getLocation();}private void getLocation () {    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    //获取所有可用的位置提供器    List<String> providers = locationManager.getProviders(true);    if (providers.contains(LocationManager.NETWORK_PROVIDER)) {        //如果是Network        locationProvider = LocationManager.NETWORK_PROVIDER;    }    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {        //获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限)        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            //请求权限            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,                    Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);        } else {            //监视地理位置变化            locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);            Location location = locationManager.getLastKnownLocation(locationProvider);            if (location != null) {                //输入经纬度                Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();            }        }    } else {        //监视地理位置变化        locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);        Location location = locationManager.getLastKnownLocation(locationProvider);        if (location != null) {            //不为空,显示地理位置经纬度            Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();        }    }}public LocationListener locationListener = new LocationListener() {    // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数    @Override    public void onStatusChanged(String provider, int status, Bundle extras) {    }    // Provider被enable时触发此函数,比如GPS被打开    @Override    public void onProviderEnabled(String provider) {    }    // Provider被disable时触发此函数,比如GPS被关闭    @Override    public void onProviderDisabled(String provider) {    }    //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发    @Override    public void onLocati d(Location location) {        if (location != null) {            //不为空,显示地理位置经纬度            Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();        }    }};@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    switch (requestCode) {        case LOCATION_CODE:            if(grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {                Toast.makeText(this, "申请权限", Toast.LENGTH_LONG).show();                try {                    List<String> providers = locationManager.getProviders(true);                    if (providers.contains(LocationManager.NETWORK_PROVIDER)) {                        //如果是Network                        locationProvider = LocationManager.NETWORK_PROVIDER;                    }else if (providers.contains(LocationManager.GPS_PROVIDER)) {                        //如果是GPS                        locationProvider = LocationManager.GPS_PROVIDER;                    }                    //监视地理位置变化                    locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener);                    Location location = locationManager.getLastKnownLocation(locationProvider);                    if (location != null) {                        //不为空,显示地理位置经纬度                        Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show();                    }                }catch (SecurityException e){                    e.printStackTrace();                }            } else {                Toast.makeText(this, "缺少权限", Toast.LENGTH_LONG).show();                finish();            }            break;    }}@Overrideprotected void onDestroy() {    super.onDestroy();    locationManager.removeUpdates(locationListener);}

}
别忘记在AndroidManifest. 加权限

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

GPS定位只需更换下面代码

   if (providers.contains(LocationManager.GPS_PROVIDER)) {        //如果是GPS        locationProvider = LocationManager.GPS_PROVIDER;    } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {        //如果是Network        locationProvider = LocationManager.NETWORK_PROVIDER;    } else {        Intent i = new Intent();        i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);        startActivity(i);    }

作者:dk123sw
来源:CSDN
原文:https://blog.csdn.net/dk123sw/article/details/90410829
版权声明:本文为博主原创文章,转载请附上博文链接!

收藏 打印