前期步骤与java一样不再赘述。这里只贴kotlin代码.
build.gradle 添加
//权限相关 implementation 'com.guolindev.permissionx:permissionx:1.6.1'
需要定位的界面的逻辑代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initPermission()
}
}
override fun onResume() {
super.onResume()
//获取定位服务
getLocationService()
}
//权限
private fun initPermission() {
PermissionX.init(this)
.permissions(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
)
.onExplainRequestReason { scope, deniedList ->
val message = "APP需要您同意以下权限才能正常使用"
scope.showRequestReasonDialog(deniedList, message, "允许", "取消")
}
.onForwardToSettings { scope, deniedList ->
scope.showForwardToSettingsDialog(deniedList, "您需要去应用程序设置当中手动开启权限", "去设置", "退出")
}
.request { allGranted, _, deniedList ->
if (allGranted) {
haveLocationPermission = true
} else {
haveLocationPermission = false
Toast.makeText(this, "您拒绝了如下权限:$deniedList", Toast.LENGTH_SHORT).show()
System.exit(0)
}
}
}
private var haveLocationPermission = false
private fun getLocationService() {
if (haveLocationPermission) {
//判断是否开启服务getSaveResponse
var locationManager = this@HomeActivity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
BLogUtils.e(TAG, "用户打开定位服务")
getLocation()
} else {
BLogUtils.e(TAG, "用户关闭定位服务")
MaterialAlertDialogBuilder(this@HomeActivity)
.setMessage("请打开位置服务开关,否则可能无法正常使用")
.setCancelable(false)
.setPositiveButton("去打开") { _, _ ->
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
//startActivityForResult(intent, 1)
startActivity(intent)
}
.setNegativeButton("退出") { _, _ -> System.exit(0) }
.show()
}
}
}
private fun getLocation() {
AMapLocationClient.updatePrivacyShow(this, true, true);
AMapLocationClient.updatePrivacyAgree(this, true);
//声明AMapLocationClient类对象
var mLocationClient = AMapLocationClient(applicationContext)
//声明定位回调监听器
//val mLocationListener = AMapLocationListener() {}
var mLocationOption = AMapLocationClientOption();
mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn)
mLocationClient.setLocationOption(mLocationOption);
//设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
mLocationClient.stopLocation();
mLocationClient.startLocation();
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否允许模拟位置,默认为true,允许模拟位置
mLocationOption.setMockEnable(true);
//单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
mLocationOption.setHttpTimeOut(20000);
//关闭缓存机制
mLocationOption.setLocationCacheEnable(false);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation()
//设置定位回调监听
mLocationClient.setLocationListener(MyLocationListener())
}
inner class MyLocationListener : AMapLocationListener {
override fun onLocationChanged(p0: AMapLocation) {
when (p0.getErrorCode()) {
0 -> {
Log.e("AmapError", "location Error, ErrCode:"
+ p0.getErrorCode() + ", errInfo:"
+ p0.getErrorInfo());
}
}
var locationStr = p0.getCity() + p0.getDistrict() + p0.getStreet()
BLogUtils.e("locationStr", locationStr)
}
237



被折叠的 条评论
为什么被折叠?



