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

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

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

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

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

不用集成第三方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;
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值