Android之高德地图定位

最近在写天气预报的app,写完以后会将源码开源,今天先写app中用到的定位问题,现在定位的SDK有很多高德地图、百度地图、腾讯地图等,腾讯地图没有用过不予评价,高德地图和百度地图对比我觉得从开发平台的给的demo来说,高德地图给的demo中的代码可读性更强,模块整理的也很好,从准确性上说个人觉得高德地图的准确性比百度地图要好很多,以前做的项目中有个导航功能,刚开始老大说用百度地图说用户量大,精度应该也更大,可是事实却不是如此,我记得当时用到了地理编码和反地理编码,误差有时候有1-2公里(不知道现在是否已经优化),后来果断改成高德地图圆满完成导航功能。

废话不说了直接进入正题,需要用高德地图实现定位功能我们首先需要到高德地图开发平台上去下载定位SDK,然后减压以后复制到app目录下libs目录下:

复制完成以后需要到build.gradle中配置如下图所示:

定义AMapLocationListener

public interface AMapLocationListener {
    void onLocationChanged(AMapLocation var1);
}

用Service来实现定位功能:

public class LocationService extends Service implements
        AMapLocationListener {
    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明mLocationOption对象
    public AMapLocationClientOption mLocationOption = null;
    private LocationBinder binder = new LocationBinder();
    private ChangeLocation changeLocation;

    @Override
    public void onCreate() {
        initLocation();
    }

    /**
     * 注册回调接口的方法,供外部调用
     */
    public void setChangeLocation(ChangeLocation changeLocationr) {
        this.changeLocation = changeLocationr;
    }

    private void initLocation() {
        mLocationClient = new AMapLocationClient(this.getApplicationContext());
        mLocationOption = new AMapLocationClientOption();
        // 设置定位模式为高精度模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        // 设置定位监听
        mLocationClient.setLocationListener(LocationService.this);
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        //设置是否只定位一次,默认为false
        mLocationOption.setOnceLocation(false);
        //设置是否强制刷新WIFI,默认为强制刷新
        mLocationOption.setWifiActiveScan(true);
        //设置是否允许模拟位置,默认为false,不允许模拟位置
        mLocationOption.setMockEnable(false);
        //设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(10000);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //启动定位
        mLocationClient.startLocation();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    public class LocationBinder extends Binder {
        public LocationService getLocationService() {
            return LocationService.this;
        }

    }

    @Override
    public void onDestroy() {
        mLocationClient.stopLocation();//停止定位
        mLocationClient.onDestroy();//销毁定位客户端。
    }

    public void onLocationChanged(AMapLocation amapLocation) {
        if (amapLocation != null) {
            changeLocation.getLocation(amapLocation);
        }
    }
}

在Activity中绑定LocationService来接收位置信息

private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            LocationService.LocationBinder binder = (LocationService.LocationBinder) service;
            locationService = binder.getLocationService();
            locationService.setChangeLocation(new ChangeLocation() {
                @Override
                public void getLocation(AMapLocation amapLocation) {
                    if (amapLocation.getErrorCode() == 0) {
             Toast.makeText(MainActivity.this, amapLocation.getCity(), Toast.LENGTH_SHORT).show();
                        PreferenceUtil.getInstance().init(MainActivity.this);
                        PreferenceUtil.getInstance().putString("location", amapLocation.getCity());
                    } else {
                        Toast.makeText(MainActivity.this, "location Error, ErrCode:"
                                + amapLocation.getErrorCode() + ", errInfo:"
                                + amapLocation.getErrorInfo(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    mIntent = new Intent(MainActivity.this, LocationService.class);
        bindService(mIntent, serviceConnection, Context.BIND_AUTO_CREATE);

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
 @Override
    protected void onDestroy() {
        unbindService(serviceConnection);
        super.onDestroy();
    }

好了,这样定位功能就ok了,看下运行的图

附上AMapLocation类中相关方法:

时间: 2024-10-03 22:53:53

Android之高德地图定位的相关文章

Android开发实现高德地图定位

一. 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的 地图SDK和定位SDK文件 进入相关下载下载自己想要的功能或文件,图只是截取了地图SDK的页面,定位SDK也是一样,按自己想要的文件下载.下载完成后解压得到: - 3D地图包解压后得到:3D地图显示包"AMap_3DMap_VX.X.X_时间.jar"和库文件夹(包含armeabi.arm64-v8a等库文件)

高德地图定位,并计算当前定位点和目标点距离

效果图: 1.下载高德地图和定位sdk,将demo中arm文件夹和jar包复制到libs中. 2.gradle 文件 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.3" sourceSets{ main{ jniLibs.srcDirs=['libs'] } } defaultConfig { applicationId "myapp

Android利用百度地图定位

百度地图照着百度的教程做的总是出现报错 请帮我看看错误在那 2013-12-13 15:16168海军 | 分类:百度地图 | 浏览1252次 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.map/com.example.map.MainActivity}: android.view.InflateException: Binary XML file line #11: Error i

android中百度地图定位的实现方法(仅适用于真机+WIFI联网环境)

注意:此方法的环境是:真机(小米手机,系统版本为Android4.2.2)+WIFI联网(才能实现最后的运行结果):使用虚拟机调试会出现各种问题. 第一步:下载SDK和申请Key 到百度的网站http://developer.baidu.com/map/ 第二步:然后选择SDK下载.(根据需要下载需要的SDK) 第三步:申请key http://developer.baidu.com/map/index.php?title=androidsdk 然后选择创建应用 需要填写:应用名称和数字签名(S

161913、ionic + 高德地图定位

实例一: var AMapArea=document.getElementById('amap'); AMapArea.parentNode.style.height="100%"; //$scope.AMapId='container'; $scope.mapObj;//存放初始化的地图对象 //$scope.initAMap=function(){ var position=new AMap.LngLat(116.397428,39.90923); $scope.mapObj=ne

Android——调用高德地图API前期准备

1.登陆高德开放平台注册账号http://lbs.amap.com/ 2.创建自己的应用并且添加新key 获取发布版安全码获取方法: 在AndroidStudio的Terminal中编译: 输入如下图: 开发版安全码获取: 开发版获取的另一种方法:(和获取发布版本一样在AndroidStudio的Terminal中编译 只是keystore的路径改成debug.keystore    密钥库口令默认是android) 创建key成功 得到key: 前期准备完成 下一篇文章是开发配置 备忘 ,也希

android 通过百度地图定位获取坐标在导航地图上面显示,坐标发生偏移

private void initMap() { // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); //

Android端 高德地图点击得到经纬度

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_select_point&q

android开发 百度地图 定位小圆点不在当前位置

注意经纬度要定义为全局变量,且此处不能直接使用location.getAttitude()和location.getLongitude 否则地图小圆点将显示在经纬度(0,0)位置.