前期步骤与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) }