在实际开发中,我们会经常要获取用户所在的城市位置,一般来说,遇到这种需求大家第一时间都会想到集成第三方地图来实现,比如百度或者高德。
但最近我在做一款个人项目时,却突然想到,如果我只是需要用户一个大概的位置,并不想获取太多的信息,
为了这样一个需求而去集成一个第三方是不是太浪费了?
于是就有了下面这些代码。
不用集成第三方sdk,只是单纯的获取用户所在的地理城市位置。
下面介绍主要步骤:
1:首先需要下面三个权限:
<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" />
分别是网络权限和两个获取地理位置的权限,不懂的同学们可以自行Google
2初始化时判断是否有权限,因为Android6.0对于获取用户的位置信息有了更多的要求,需要我们动态获取权限
另外定义三个变量
private String provider;//位置提供器 private LocationManager locationManager;//位置服务 private Location location;
//判断是否有权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //权限还没有授予,需要在这里写申请权限的代码 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); } else { //获取位置的方法 dingWei(); }
3判断是否动态获取权限
//判断是否动态获取权限 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 1) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { dingWei(); } else { } } }
4获取位置的三个方法 然后解析网络请求框架获取到的json即可
private void dingWei() { //权限已经被授予,在这里直接写要执行的相应方法即可 //更改头像 //调用相册 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);//获得位置服务 provider = judgeProvider(locationManager); if (provider != null) {//有位置提供器的情况 //为了压制getLastKnownLocation方法的警告 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } location = locationManager.getLastKnownLocation(provider); if (location != null) { getLocation(location);//得到当前经纬度并开启线程去反向地理编码 } else { //暂时无法获得当前位置 } } else { //不存在位置提供器的情况 } } /** * 得到当前经纬度并开启线程去反向地理编码 */ public void getLocation(Location location) { String latitude = location.getLatitude() + ""; String longitude = location.getLongitude() + ""; Log.d("print", "getLocation: ---->" + latitude + " " + longitude); String url = "http://maps.google.cn/maps/api/geocode/json?latlng=" + latitude + "," + longitude + "&sensor=true,language=zh-CN"; // 这里是网络请求(我使用的是自己封装的请求框架,你可换成你自己的网络请求框架,请求上面这个url即可) Log.d("print", "地址是:" + url); new DownUtil().setOnDownListener(this).downJSON(url); } /** * 判断是否有可用的内容提供器 * * @return 不存在返回null */ private String judgeProvider(LocationManager locationManager) { List<String> prodiverlist = locationManager.getProviders(true); if (prodiverlist.contains(LocationManager.NETWORK_PROVIDER)) { return LocationManager.NETWORK_PROVIDER; } else if (prodiverlist.contains(LocationManager.GPS_PROVIDER)) { return LocationManager.GPS_PROVIDER; } else { Toast.makeText(MainActivity.this, "没有可用的位置提供器,请手动打开定位权限", Toast.LENGTH_SHORT).show(); } return null; }