安卓定位方式全总结-gps定位,network定位,ip定位,基站定位

一般我们使用的是第三方定位,因为第三方定位比较成熟,有些场景我们不需要或者不可以使用第三方定位的时候我们就需要自己去获取定位了。

定位方式

1.gps和network(时效性差)

1.1 使用条件
1.1.1 需要开启位置服务:

高精准度(GPS+Network)
节电(network)
仅限设备(gps)

1.1.2 安卓6.0以上还需要开启位置权限android.permission.ACCESS_COARSE_LOCATION,android.permission.ACCESS_FINE_LOCATION
1.2 代码部分

gps为卫星定位,室外定位。network室内也可以定位,但是精准度不高。在我们必须要快速获取位置信息的时候,我们加上IP定位和基站定位效果会好一些

1.2.1 定位工具类
/**
 * @author 程前 on 2018/9/26.
 * blog: https://blog.csdn.net/ch1406285246
 * content:
 * modifyNote:
 */
object LocationUtils {

    var latitude = 0.0
    var longitude = 0.0
    /**
     * 获取经纬度
     *
     * @param context
     * @return
     */
    @SuppressLint("MissingPermission")
    fun getLngAndLat(context: Context): String {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        val providers = locationManager.allProviders
        for (provider in providers) {
            val location = locationManager.getLastKnownLocation(provider)
            if (location != null) {
                latitude = location.latitude
                longitude = location.longitude
                return "$longitude,$latitude"
            }
        }
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0F, locationListener)
        val location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
        if (location != null) {
            latitude = location.latitude
            longitude = location.longitude
        }
        return "$longitude,$latitude"
    }


    val locationListener = object : LocationListener {
        override fun onLocationChanged(location: Location?) {
            if (location != null) {
                latitude = location.latitude;
                longitude = location.longitude;
            }
        }

        override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
        }

        override fun onProviderEnabled(provider: String?) {
        }

        override fun onProviderDisabled(provider: String?) {
        }
    };


    /**
     * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
     * @param context
     * @return true 表示开启
     */
    fun isOPen(context: Context): Boolean {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
        val gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
        val network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (gps || network) {
            return true;
        }

        return false;
    }

}
1.2.2 检查定位服务
 /**
     * 检查定位服务有没有开启,没有开启就引导用户去开启定位服务
     * */
    private fun checkLocation() {
        if (!LocationUtils.isOPen(this)) {
            //没有打开则弹出对话框
            //下面是个dialog,请自己写,我的封装dialog不贴出来
            val tipDialog = TipDialog(this)
                    .setTitle("提示")
                    .setContent("当前应用需要打开定位功能。\n\n请点击\"设置\"-\"定位服务\"-打开定位功能。")
                    .setLeftBtnText("取消")
                    .setRightBtnText("去设置")
            tipDialog.setOnBtnClickListener(object : TipDialog.OnDialogBtnClickListener {
                override fun onLeftBtnClicked(paramTipDialog: TipDialog?) {
                    tipDialog.dismiss()
                }

                override fun onRightBtnClicked(paramTipDialog: TipDialog?) {
                    tipDialog.dismiss()
                    //跳转GPS设置界面
                    val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivityForResult(intent, GPS_REQUEST_CODE);
                }
            }).show()
        }
    }
1.2.3 设置完成之后获取经纬度信息
 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == GPS_REQUEST_CODE) {
            //做需要做的事情,比如再次检测是否打开GPS了 或者定位
            checkLocation()
        }else{
        	val locationStr=LocationUtils.getLngAndLat(this)
        }
    }

2.IP定位(准确性差)

访问API拿到IP信息,例http://pv.sohu.com/cityjson?ie=utf-8
IP定位.png
如果你仅仅只是需要城市,那么这样做足够了,如果你还要更详细的信息,请使用IP查询地理位置信息的API。

3.基站定位(收费)

需要选用第三方的服务进行基站定位
推荐一:google官方
推荐二:聚合API

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值