首页 > 学院 > 开发设计 > 正文

(原创)不用百度地图实现城市定位

2019-11-06 09:43:42
字体:
来源:转载
供稿:网友

在实际开发中,我们会经常要获取用户所在的城市位置,一般来说,遇到这种需求大家第一时间都会想到集成第三方地图来实现,比如百度或者高德。

但最近我在做一款个人项目时,却突然想到,如果我只是需要用户一个大概的位置,并不想获取太多的信息,

为了这样一个需求而去集成一个第三方是不是太浪费了?

于是就有了下面这些代码。

不用集成第三方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判断是否动态获取权限

//判断是否动态获取权限@Overridepublic 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;    }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表