Android 编程 高德地图 (实现显示地图以及定位功能)
本文参考文章:
http://www.apkbus.com/blog-904057-63610.html
本人实现的 定位代码:(具体配置省略,可见参考文章)
- package com.example.demo.fuction;
- import android.graphics.BitmapFactory;
- import android.os.Bundle;
- import android.support.annotation.Nullable;
- import android.support.v7.app.AppCompatActivity;
- import android.util.Log;
- import com.amap.api.location.AMapLocation;
- import com.amap.api.location.AMapLocationClient;
- import com.amap.api.location.AMapLocationClientOption;
- import com.amap.api.location.AMapLocationListener;
- import com.amap.api.maps2d.AMap;
- import com.amap.api.maps2d.AMapOptions;
- import com.amap.api.maps2d.CameraUpdateFactory;
- import com.amap.api.maps2d.MapView;
- import com.amap.api.maps2d.UiSettings;
- import com.amap.api.maps2d.model.BitmapDescriptor;
- import com.amap.api.maps2d.model.BitmapDescriptorFactory;
- import com.amap.api.maps2d.model.LatLng;
- import com.amap.api.maps2d.model.Marker;
- import com.amap.api.maps2d.model.MarkerOptions;
- import com.joe.ditudemo.R;
- import static com.amap.api.location.AMapLocationClientOption.AMapLocationMode.Hight_Accuracy;
- /**
- * Created by Joe.
- */
- public class GetMyLocationActivity extends AppCompatActivity {
- //声明AMapLocationClient类对象
- public AMapLocationClient mLocationClient = null;
- //声明mLocationOption对象
- public AMapLocationClientOption mLocationOption = null;
- private double lat;
- private double lon;
- private MapView mapView;
- private AMap aMap;//地图控制器对象
- private UiSettings mUiSettings;
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_get_mylocation);
- //初始化定位
- mLocationClient = new AMapLocationClient(getApplicationContext());
- //设置定位回调监听
- mLocationClient.setLocationListener(mLocationListener);//设置其为定位完成后的回调函数
- mapView = (MapView) findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- init();
- }
- /**
- * * 初始化AMap类对象 aMap 地图控制器
- */
- private void init() {
- if (aMap == null) {
- aMap = mapView.getMap();//地图控制器对象
- mUiSettings = aMap.getUiSettings();
- }
- //设置logo位置
- mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_CENTER);//高德地图标志的摆放位置
- mUiSettings.setZoomControlsEnabled(true);//地图缩放控件是否可见
- mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM);//地图缩放控件的摆放位置
- //aMap 为地图控制器对象
- aMap.getUiSettings().setMyLocationButtonEnabled(true);//地图的定位标志是否可见
- aMap.setMyLocationEnabled(true);//地图定位标志是否可以点击
- setUpMap();
- }
- /**
- * 配置定位参数
- */
- private void setUpMap() {
- //初始化定位参数
- mLocationOption = new AMapLocationClientOption();
- //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
- mLocationOption.setLocationMode(Hight_Accuracy);
- //设置是否返回地址信息(默认返回地址信息)
- mLocationOption.setNeedAddress(true);
- //设置是否只定位一次,默认为false
- mLocationOption.setOnceLocation(false);
- //设置是否允许模拟位置,默认为false,不允许模拟位置
- mLocationOption.setMockEnable(false);
- //设置定位间隔,单位毫秒,默认为2000ms
- mLocationOption.setInterval(2000);
- //给定位客户端对象设置定位参数
- mLocationClient.setLocationOption(mLocationOption);
- //启动定位
- mLocationClient.startLocation();
- }
- public AMapLocationListener mLocationListener = new AMapLocationListener() {
- @Override
- public void onLocationChanged(AMapLocation amapLocation) {
- if (amapLocation != null) {
- if (amapLocation.getErrorCode() == 0) {
- Log.v("getLocationType", ""+amapLocation.getLocationType() ) ;
- lat = amapLocation.getLatitude();
- lon = amapLocation.getLongitude();
- Log.v("getAccuracy", ""+amapLocation.getAccuracy()+" 米");//获取精度信息
- Log.v("joe", "lat :-- " + lat + " lon :--" + lon);
- Log.v("joe", "Country : " + amapLocation.getCountry() + " province : " + amapLocation.getProvince() + " City : " + amapLocation.getCity() + " District : " + amapLocation.getDistrict());
- //清空缓存位置
- aMap.clear();
- // 设置显示的焦点,即当前地图显示为当前位置
- aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 18));
- //aMap.moveCamera(CameraUpdateFactory.zoomTo(18));
- //aMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lon)));
- MarkerOptions markerOptions = new MarkerOptions();
- markerOptions.position(new LatLng(lat, lon));
- markerOptions.title("我的位置");
- markerOptions.visible(true);
- BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.icon_location));
- markerOptions.icon(bitmapDescriptor);
- markerOptions.draggable(true);
- Marker marker = aMap.addMarker(markerOptions);
- marker.showInfoWindow();
- } else {
- //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
- Log.e("joe", "location Error, ErrCode:"
- + amapLocation.getErrorCode() + ", errInfo:"
- + amapLocation.getErrorInfo());
- }
- }
- }
- };
- /**
- * 重新绘制加载地图
- */
- @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();
- if (mLocationClient != null) {
- mLocationClient.stopLocation();
- mLocationClient.onDestroy();
- }
- mLocationClient = null;
- }
- }
以上代码亲测可行,不过有些不必要的设置没有加,下面给出一些没有加入的代码:
- // 设置定位请求超时时间,默认为30秒
- // 单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
- mLocationOption.setHttpTimeOut(50000);
- // 设置是否开启定位缓存机制
- // 缓存机制默认开启,可以通过以下接口进行关闭。
- // 当开启定位缓存功能,在高精度模式和低功耗模式下进行的网络定位结果均会生成本地缓存,不区分单次定位还是连续定位。GPS定位结果不会被缓存。
- // 关闭缓存机制
- mLocationOption.setLocationCacheEnable(false);
- // 设置是否只定位一次,默认为false
- mLocationOption.setOnceLocation(false);
- // 给定位客户端对象设置定位参数
- mLocationClient.setLocationOption(mLocationOption);
上面的 setHttpTimeOut 方法 是设置定位请求协议中的 http 超时的情况下的超时时间, 这里个人认为这是采用Wifi定位设置时采用的交互协议。
- mLocationOption.setOnceLocation(false); 该方法是设置 定位 是否是只定位一次 ,也或者是会连续定位。
- mLocationOption.setLocationCacheEnable(false); 定位的缓存结果设置选项
本人所写的代码某次运行后 打印的定位类型信息如下:
个人估计, 如果设置缓存后, APP 会把定位信息写到缓存中, APP再次运行后如果在某个设定的时间内缓存中有定位信息则会先读取缓存中的定位信息。
由于 本人做试验的时候是在室内, gps定位效果不佳于是默认转为了 wifi定位, 这时候提示的定位信息为 5 。
然后由于后面的定位都是连续的比较紧,在2000ms左右就又一次请求定位, 而且并没有水平移动(手机的位移传感器可以度量),于是直接采用前次的定位信息,这时的定位类型为 2 。
Android 编程 高德地图 (实现显示地图以及定位功能)的更多相关文章
- Android百度地图之显示地图
添加地图显示 一.在百度官网下载相关的SDK (网址:http://developer.baidu.com/map/sdkandev-download.htm) 解压下载好的BaiduMap_Andr ...
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...
- 【第三方SDK】百度地图实现最简单的定位功能(无地图界面)
在近期的项目中,须要实现无地图界面的定位功能,定位用户所在的城市.因此,本篇文章,主要介绍怎样使用百度地图SDK实现无导航界面的定位功能. 1.申请百度开发人员账户 2.创建应用,获取key 例如以下 ...
- Android编程 高德地图 中如何重写 定位按键 的触发事件 (com.amap.api.maps2d.LocationSource)点击定位后不仅定位在地图中心点上而且可以设置地图的缩放大小和提示
在利用高德地图来编写自己的APP的时候,发现了一种对定位按键的重写方法,那就是利用 com.amap.api.maps2d.LocationSource 接口来重写. 什么是定位按键呢,下图中右 ...
- Android编程 高德地图 AMapLocationClientOption 类中 setWifiActiveScan过时
高德地图中 定位包中有以下方法: AMapLocationClientOption 类中 setWifiActiveScan 过时 isWifiActiveScan public boole ...
- Android编程之仿微信显示更多文字的View
微信朋友圈中,如果好友发表的文字过长,会自动收缩起来,底下有提示,当点击“显示更多”时才会展开. 首先定义布局文件(很简单,不解释): <?xml version="1.0" ...
- 地图之CLLocationManager的使用 定位功能使用
1.iOS8曾经使用CLLocationManager 1.导入头文件 <CoreLocation/CoreLocation.h> 2.创建位置管理者 CLLocationManager ...
- Android开发10:传感器器及地图相关应用
前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...
- android studio高德地图的显示于定位(附带逆地理编码围栏)
首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...
随机推荐
- Spring Boot 之restful风格
步骤一:restful风格是什么? 我们知道在做web开发的过程中,method常用的值是get和post.可事实上,method值还可以是put和delete等等其他值. 既然method值如此丰富 ...
- [参考]C的scanf 和 C++的fscanf 的用法
说明:本文不适合新手学习,适合用来做参考.本文参考有其他博客的内容,不过年代久远已经忘记了,在此感谢各位博主! scanf函数 用 法:int scanf(char *format[,argument ...
- 简单的使用hibernate插入数据的例子
数据库创建脚本: drop table person create table person( id varchar(32) not null primary key ...
- Java管理扩展指南之JMX技术总览
JMX(Java管理扩展)系列 JMX(Java管理扩展)系列旨在介绍包含于Java基础版本(Java SE)中的JMX技术.本系列提供了如何使用JMX重要技术特性的诸多示例. 一.JMX技术总览简要 ...
- [转]检测SQLSERVER数据库CPU瓶颈及内存瓶颈
在任务管理器中看到sql server 2000进程的内存占用,而在sql server 2005中,不能在任务管理器中查看sql server 2005进程的内存占用,要用 以下语句查看sql se ...
- css实现一色多变化
.pesudo{ position: absolute; top:50%; left: 50%; transform:translate(-50%,-50%); width: 120px; paddi ...
- 蓄水池抽样算法 Reservoir Sampling
2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求 ...
- MongoDB开启安全认证
MongoDB开启安全认证 注意 对MongoDB部署启用访问控制会强制执行身份验证,要求用户识别自己.当访问启用了访问控制的MongoDB部署时,用户只能执行由其角色确定的操作. 启用访问控制后,请 ...
- panda2
pandas是python为数据分析建造的可靠工具,很多地方和R语言有想通之处.数据分析并不是工具越高深越好,excel,R,python都是针对不同情况的不同工具,各有各的优缺点,就像你要搭一个架子 ...
- WPF应用的一些小总结(模板、样式,上下文)
1: 后台:XXX.DataContext = ViewModel(数据对象)(XXX可以是当前的UserControl.Windows.Grid.TextBlock.Lable等UI控件,选择不同的 ...