安卓开发Android开发经验谈安卓开发

安卓获取当前地理位置(集成高德地图)

2019-08-14  本文已影响8人  蓝不蓝编程

高德地图定位优缺点:

集成方法

  1. 修改build.gradle文件
implementation 'com.amap.api:location:latest.integration'
implementation 'com.afollestad:assent:2.3.1'
  1. 修改manifest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.cxyzy.demo">

    <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!--用于访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="f79c5a4588621faaa90df09b736cae53" />
        <!-- 定位需要的服务 -->
        <service android:name="com.amap.api.location.APSService" />
    </application>

</manifest>
  1. 调用
class MainActivity : AppCompatActivity() {
    private lateinit var mLocationClient: AMapLocationClient
    private var mLocationOption = AMapLocationClientOption()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initMap()
        locateBtn.setOnClickListener { locate() }
    }

    private fun initMap() {
        mLocationClient = AMapLocationClient(applicationContext)
        mLocationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy
        mLocationOption.isOnceLocation = true

        //获取最近3s内精度最高的一次定位结果:
        //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
        mLocationOption.isOnceLocationLatest = true

        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.isNeedAddress = true
        //关闭缓存机制
        mLocationOption.isLocationCacheEnable = false

        //声明定位回调监听器
        val locationListener = AMapLocationListener { loc ->
            progressBar.visibility = GONE
            if (null != loc) {
                //解析定位结果
                val result = Utils.getLocationStr(loc)
                locationTv.text = result
            } else {
                locationTv.text = getString(R.string.locate_failed)
            }
        }
        //设置定位回调监听
        mLocationClient.setLocationListener(locationListener)
    }

    private fun locate() {
        runWithPermissions(Permission.ACCESS_FINE_LOCATION) {
            if (isLocationProviderEnabled(this@MainActivity)) {
                locationTv.text = ""
                progressBar.visibility = VISIBLE
                //给定位客户端对象设置定位参数
                mLocationClient.setLocationOption(mLocationOption);
                //启动定位
                mLocationClient.startLocation()
            } else {
                Utils.showAlert("本应用需要获取地理位置,请打开获取位置的开关", this)
            }
        }
    }

}
object Utils {
    /**
     * 根据定位结果返回定位信息的字符串
     */
    fun getLocationStr(location: AMapLocation): String? {
        val sb = StringBuffer()
        //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
        if (location.errorCode == 0) {
            sb.append("定位成功" + "\n")
            sb.append("定位类型: " + location.locationType + "\n")
            sb.append("经    度    : " + location.longitude + "\n")
            sb.append("纬    度    : " + location.latitude + "\n")
            sb.append("精    度    : " + location.accuracy + "米" + "\n")
            sb.append("提供者    : " + location.provider + "\n")

            sb.append("速    度    : " + location.speed + "米/秒" + "\n")
            sb.append("角    度    : " + location.bearing + "\n")
            // 获取当前提供定位服务的卫星个数
            sb.append("星    数    : " + location.satellites + "\n")
            sb.append("国    家    : " + location.country + "\n")
            sb.append("省            : " + location.province + "\n")
            sb.append("市            : " + location.city + "\n")
            sb.append("城市编码 : " + location.cityCode + "\n")
            sb.append("区            : " + location.district + "\n")
            sb.append("区域 码   : " + location.adCode + "\n")
            sb.append("地    址    : " + location.address + "\n")
            sb.append("兴趣点    : " + location.poiName + "\n")
            //定位完成的时间
            sb.append("定位时间: " + formatUTC(location.time, "yyyy-MM-dd HH:mm:ss") + "\n")
        } else {
            //定位失败
            sb.append("定位失败" + "\n")
            sb.append("错误码:" + location.errorCode + "\n")
            sb.append("错误信息:" + location.errorInfo + "\n")
            sb.append("错误描述:" + location.locationDetail + "\n")
        }
        //定位之后的回调时间
        sb.append("回调时间: " + formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n")
        return sb.toString()
    }

    private fun formatUTC(l: Long, strPattern: String): String {
        val sdf = SimpleDateFormat(strPattern, Locale.CHINA)
        return sdf.format(l)
    }

    /**
     * 判断是否开启了GPS或网络定位开关
     *
     * @return
     */
    fun isLocationProviderEnabled(context: Context): Boolean {
        var result = false
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
                || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            result = true
        }
        return result
    }

    fun showAlert(message: String, context: Context) {
        val alertDialog = AlertDialog.Builder(context).setMessage(message).setCancelable(false)
                .setPositiveButton(android.R.string.ok)
                { dialog, _ ->
                    dialog.dismiss()
                }
                .setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() }
                .create()
        alertDialog.show()
    }
}

完整源代码

https://gitee.com/cxyzy1/geolocationDemo/tree/master/amapDemo

上一篇下一篇

猜你喜欢

热点阅读