前言:基于地理位置的服务目前十分火爆,因此在工作中经常会涉及到地理位置的获取。就我的了解,是有三种方式获取位置信息,分别是基于GPS和基于网络以及利用第三方获取位置信息。我个人习惯使用第三方,如百度地图、高德地图,因为其可以获取到详细的信息,而不仅仅是经纬度,更甚的是还可以获取天气情况~
但是,今天记录的并不是集成第三方SDK,而是前两种方式。前两种方式一般来说是需要结合使用的,毕竟并不所有的手机都支持GPS。与集成第三方相比,前两种方式不需要增加项目体积。
安卓提供了许多的服务,位置服务也是其中之一,我们正是借助该服务获取当前的经纬度,接下来便贴上相关代码:
所需权限,需要注意的是6.0以上需要动态申请
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.INTERNET, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION };
public static void verifyStoragePermissions(Activity activity) { // 检查权限是否已经申请 int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // 申请权限 ActivityCompat.requestPermissions( activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE ); } }
根据网络获取位置信息
public String getLocationByNet() { double latitude = 0.0; double longitude = 0.0; LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, listener); Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); }else{ return "error";//获取失败 } return longitude + "," + latitude; }
LocationListener listener = 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 onLocationChanged(Location location) { }
基于GPS获取经纬度,如果信号弱或者直接不支持GPS的调用基于网络获取的方法获取
private String getLocationByGps(Context context) { double latitude = 0.0; double longitude = 0.0; LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { //从gps获取经纬度 Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } else { //GPS信号弱,位置信息可能获取失败 return getLocationByNet(); } } else { //网络获取经纬度 return getLocationByNet(); } return longitude + "," + latitude; }