一般我们使用的是第三方定位,因为第三方定位比较成熟,有些场景我们不需要或者不可以使用第三方定位的时候我们就需要自己去获取定位了。
定位方式
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查询地理位置信息的API。
网友评论