您现在的位置是:首页 > 文章详情

Android原生方式获取经纬度

日期:2019-07-09点击:561

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

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

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

public class GPSActivity extends AppCompatActivity {

public static final int LOCATION_CODE = 301; private LocationManager locationManager; private String locationProvider = null; @Override protected 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 onLocationChanged(Location location) { if (location != null) { //不为空,显示地理位置经纬度 Toast.makeText(GPSActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show(); } } }; @Override public 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; } } @Override protected void onDestroy() { super.onDestroy(); locationManager.removeUpdates(locationListener); }

}
别忘记在AndroidManifest.xml加权限

<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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文链接:https://yq.aliyun.com/articles/708442
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章