高德地图API总结--地图加载、权限,定位

使用前准备

SDK下载

地址:<u>http://lbs.amap.com/api/android-sdk/down/</u>

image.png

Jar包与库文件的使用
image.png

在项目中按照如上方法使用高德地图的库文件和jar包
AMap_3DMap….jar---使用高德3D地图的jar包
AMap_Location….jar---定位相关功能使用的jar包
此外还有:
搜索使用的jar包
image.png

获取Key

登陆高德地图API <u>http://lbs.amap.com/dev/#/</u> 控制台

创建应用,添加key

Key名称:自定义设置

服务平台:填写对应的开发平台,这里是Android

发布版安全码SHA1:开发的APP的SHA码

Package:这里填写包名,要填写使用的app的包名


image.png

AndroidManifest.xml的配置

权限配置:

 //地图包、搜索包需要的基础权限
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    //定位包、导航包需要的额外权限(注:基础权限也需要)
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

配置Key值:

<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="4048e214cf637ef2931e517a8dd2cecc" />
设置定位服务的Service
<!-- 定位需要的服务 使用2.0的定位需要加上这个 -->
<service android:name="com.amap.api.location.APSService" />

高德地图使用

定义MapView
private MapView mapView;
先获取布局中的mapview的id,然后创建实例,具体如下:
mapView = (MapView) findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);// 此方法必须重写
在使用map的activity中必须重写一下方法:

@Override
protected void onResume() {
   super.onResume();
   mapView.onResume();
}
暂停
@Override
protected void onPause() {
   super.onPause();
   mapView.onPause();
}
重载时调用
@Override
protected void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   mapView.onSaveInstanceState(outState);
}
销毁地图
@Override
protected void onDestroy() {
   super.onDestroy();
   mapView.onDestroy();
}

在整个activity生命周期中实现对MapView的控制
其次初始化map对象

/**
 * 初始化AMap对象
 */
   if (aMap == null) {
      aMap = mapView.getMap();
    }

Xml布局引入

<com.amap.api.maps.MapView
    android:id="@+id/mapview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

接口说明:

MapView 一个显示地图的视图(View)。它负责从服务端获取地图数据。当屏幕焦点在这个视图上时,它将会捕捉键盘事件(如果手机配有实体键盘)及屏幕触控手势事件。 使用这个类必须按照它的生命周期进行操控,你必须参照以下方法onCreate(Bundle)、 onResume()、onPause()、onDestroy()、onSaveInstanceState(Bundle)、onLowMemory() 当MapView初始化完成后,用户可以通过getMap()方法获得一个AMap 对象。如果MapView 没有初始成功,则执行getMap()将返回null
AMap定义AMap 地图对象的操作方法与接口

地图定位

image.png

图 2.2.0

实现的接口与重写的方法

方法需要继承
implements LocationSource,AMapLocationListener
LocationSource重写LocationSource的两个方法,目的是是让地图显示定位地点。(如下:激活定位activate、停止定位deactivate,其中deactivate需要在activity的onPause中调用释放定位占用的资源)

/**
 * 激活定位
 */
@Override
public void activate(OnLocationChangedListener listener) {
   mListener = listener;
   if (mlocationClient == null) {
      mlocationClient = new AMapLocationClient(this);
      mLocationOption = new AMapLocationClientOption();
      //设置定位监听
      mlocationClient.setLocationListener(this);
      //设置为高精度定位模式
      mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
      //设置定位参数
      mlocationClient.setLocationOption(mLocationOption);
      // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
      // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
      // 在定位结束后,在合适的生命周期调用onDestroy()方法
      // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
      mlocationClient.startLocation();
   }
}
/**
 * 停止定位
 */
@Override
public void deactivate() {
   mListener = null;
   if (mlocationClient != null) {
      mlocationClient.stopLocation();
      mlocationClient.onDestroy();
   }
   mlocationClient = null;
}

AMapLocationListenter高德定位监听

##定义AMap 地图对象的操作方法与接口。
private AMap aMap;

设置定位监听

aMap.setLocationSource(this);// 设置定位监听
// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.setMyLocationEnabled(true);

设置定位间隔

使用AMapLocationClientOption中的setinterval方法,
private AMapLocationClientOption mLocationOption;
mLocationOption = new AMapLocationClientOption();
mLocationOption.setInterval(2000);//设置间隔时间

设置当前定位模式:
定位类型总共有三种模式,定位,跟随和旋转

// 设置定位的类型为定位模式
aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
// 设置定位的类型为 跟随模式
aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_FOLLOW);
// 设置定位的类型为根据地图面向方向旋转
aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);

使用方式的确定根据需要确定定位模式,更随模式和旋转模式
定位图标
使用高德原生定位图标,此方法的实现只要一行代码便可以实现,较为简单
方法:aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置、
如果发现自定义图标不怎么美观,我们也可以使用自定义图标,可以随意定义,实现如下:

aMap.getUiSettings().setMyLocationButtonEnabled(false);// 设置默认定位按钮是否显示
//设置地图定位图标
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.mapshow_location));//设置图标样式
//以下两行设置定位图标周围的圆圈背景为透明
myLocationStyle.radiusFillColor(android.R.color.transparent);
myLocationStyle.strokeColor(android.R.color.transparent);
//实现图标样式
aMap.setMyLocationStyle(myLocationStyle);

自定义图标的自由度较高,可以根据不同的需要设置不同的图标样式,在使用时我们需要先把地图中本身的图标设置为false:aMap.getUiSettings().setMyLocationButtonEnabled(false);使地图自带的图标不显示,然后设置我们想要的图标的样式
以上方法需要的地图初始化的时候统一调用
注;android6.0级以上版本需要先获取定位权限
获取权限的代码:

//检查Adroid版本是否高于23,并判断定位权限是否开启
    private void startMyLocation() {
        if (Build.VERSION.SDK_INT >= 23) {
            int checkPermission = ContextCompat.checkSelfPermission(MapActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION);
            if (checkPermission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MapActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
                return;
            } else {
                此处调用地图初始化时的定位功能
            }
        } else {
            此处调用地图初始化时的定位功能
        }
    }
返回权限请求的结果
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //启动定位
                    此处调用地图初始化时的定位功能
                } else {
                    showToast("您禁止了定位权限,导致定位功能不可用,您可以选择使用时手动开启");
                }
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                break;
              default:
                 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

Manifest.permission.ACCESS_COARSE_LOCATION定位权限

自定义按钮实现回到当前位置的方法

高德地图只提供了自身的一个定位回到当前位置的按钮,API未提供接口方法;如果不适用高德地图自定义的按钮,可以参考一下方法进行实现回到当前位置的自定义方法:

//定位按钮实现定位
public void BackMyLocation() {
//判断地图定位返回,是否为空
    if (aMap.getMyLocation() != null) {
//获取定位点的经纬度坐标
        Dlongitude = aMap.getMyLocation().getLongitude();
        DLatitude = aMap.getMyLocation().getLatitude();
        LatLng start = new LatLng(DLatitude, Dlongitude);
//实现移动到定位点的功能
        aMap.moveCamera(CameraUpdateFactory.changeLatLng(start));
        aMap.moveCamera(CameraUpdateFactory.zoomTo(10));
    } else {
        showToast("正在定位,请检查网络或者定位权限是否开启");
    }
}

定位成功后回调的参数:

/**
 * 定位成功后回调函数
 */
@Override
public void onLocationChanged(AMapLocation amapLocation) {
   if (mListener != null && amapLocation != null) {
      if (amapLocation != null
            && amapLocation.getErrorCode() == 0) {
         mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
      } else {
         String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
         Log.e("AmapErr",errText);
      }
   }
}

以前写的文章没有发表的,仅供参考和学习只用
谢谢惠顾,感觉有用的点个赞

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容