一、地图集成

集成腾讯地图SDK,https://lbs.qq.com/,申请AppKey。

1、dependencies

implementation 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.2.6'
implementation 'com.tencent.map:tencent-map-vector-sdk:4.3.4'

2、AndroidManifest.xml

<application<meta-dataandroid:name="TencentMapSDK"android:value="*****-*****-*****-*****-*****-*****"/>
</application>

3、权限

<!--腾讯地图 SDK 要求的权限(开始)-->
<!--访问网络获取地图服务-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--检查网络可用性-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 访问WiFi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--需要外部存储写权限用于保存地图缓存-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--获取 device id 辨别设备-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--腾讯地图 SDK 要求的权限(结束)-->

注意:这块除了AndroidManifest.xml权限之外还需要动态定义以下权限:

Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.READ_PHONE_STATE

另外还需要打开手机定位功能:

public static void showSystemGPS(Activity activity) {if (!isOpenGPS()) {Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);WeDaActivity a = (WeDaActivity) activity;a.startActivityForResult(intent, ConstantUtils.REQUEST_SYSTEM_OPEN_GPS, (requestCode, resultCode, data) -> {if (isOpenGPS()) {UIUtils.showToast(activity, "GPS打开成功");} else {UIUtils.showToast(activity, "GPS打开失败");}});} else {UIUtils.showToast(activity, "GPS已经打开了");}
}public static boolean isOpenGPS() {LocationManager locationManager= (LocationManager) ApplicationUtils.getContext().getSystemService(Context.LOCATION_SERVICE);return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

4、混淆

-keep class com.tencent.tencentmap.**{*;}
-keep class com.tencent.map.**{*;}
-keep class com.tencent.beacontmap.**{*;}
-keep class navsns.**{*;}
-dontwarn com.qq.**
-dontwarn com.tencent.**

二、定义视图布局

1、地图控制布局

<com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/mapview"android:layout_width="fill_parent"android:layout_height="fill_parent" />

2、搜索框控件布局

<EditTextandroid:id="@+id/et_search"android:layout_width="match_parent"android:layout_height="33dp"android:layout_marginLeft="15dp"android:layout_marginTop="10dp"android:layout_marginRight="15dp"android:layout_marginBottom="10dp"android:layout_toLeftOf="@+id/tv_cancel_search"android:background="@drawable/shape_search_map"android:focusable="false"android:focusableInTouchMode="true"android:gravity="center"android:hint="@string/map_search_hint"android:imeOptions="actionSearch"android:inputType="text"android:paddingLeft="10dp"android:singleLine="true"android:textColor="@color/c_181818"android:textSize="15sp" />

3、进度条控件布局

<ProgressBarandroid:id="@+id/pb_progress"style="@android:style/Widget.Holo.ProgressBar"android:layout_width="70dp"android:layout_height="70dp"android:layout_gravity="center"android:visibility="visible" />

三、绑定地图生命周期

    @Overridepublic void onDestroy() {mapView.onDestroy();super.onDestroy();tencentMap.removeTencentMapGestureListener(mapGestureListener);}@Overridepublic void onPause() {mapView.onPause();super.onPause();}@Overridepublic void onResume() {mapView.onResume();super.onResume();}@Overridepublic void onStop() {mapView.onStop();super.onStop();}@Overridepublic void onStart() {mapView.onStart();super.onStart();}

四、请求定位

1、创建定位请求对象

mapView = view.findViewById(R.id.mapview);
tencentMap = mapView.getMap();//创建地图请求对象
locationManager = TencentLocationManager.getInstance(context);
locationRequest = TencentLocationRequest.create();
locationRequest.setInterval(3000);

setInterval:用于设置连续定位的请求的间隔时间,这里设置3000毫秒回调一次。如果只需要定位一次,则调用locationManager.removeUpdates(this);取消连续定位回调。

2、请求定位信息

private void requestLocationUpdates() {int error = locationManager.requestLocationUpdates(locationRequest, LocationMapFragment.this);String des = "";switch (error) {case 0:des = "成功注册监听器";break;case 1:des = "设备缺少使用腾讯定位服务需要的基本条件";break;case 2:des = "manifest 中配置的 key 不正确";break;case 3:des = "自动加载libtencentloc.so失败";break;default:break;}LogUtils.d(des);
}

五、注册回调

1、实现地图相关接口

  • LocationSource:页面显示和关闭的回调
  • TencentLocationListener:连续定位获取位置信息的回调

(1)LocationSource

@Override
public void activate(OnLocationChangedListener arg0) {mChangedListener = arg0;//页面打开,请求定位信息requestLocationUpdates();
}@Override
public void deactivate() {//页面移出,清除位置回调locationManager.removeUpdates(this);locationManager = null;locationRequest = null;mChangedListener = null;
}

(2)TencentLocationListener

@Override
public void onLocationChanged(TencentLocation tencentLocation, int arg1, String arg2) {if (arg1 == TencentLocation.ERROR_OK && mChangedListener != null) { Location location = new Location(tencentLocation.getProvider());//设置经纬度location.setLatitude(tencentLocation.getLatitude());location.setLongitude(tencentLocation.getLongitude());//设置精度,这个值会被设置为定位点上表示精度的圆形半径location.setAccuracy(tencentLocation.getAccuracy());//设置定位标的旋转角度,注意 tencentLocation.getBearing() 只有在 gps 时才有可能获取location.setBearing((float) tencentLocation.getBearing());//将位置信息返回给地图mChangedListener.onLocationChanged(location);//移出回调,只请求一次,如果需要连续定位,删除这行代码locationManager.removeUpdates(this);} else {LogUtils.d("onLocationChanged error");}
}@Override
public void onStatusUpdate(String s, int i, String s1) {String desc = "";switch (i) {case TencentLocationListener.STATUS_DENIED:desc = "权限被禁止";break;case TencentLocationListener.STATUS_DISABLED:desc = "模块关闭";break;case TencentLocationListener.STATUS_ENABLED:desc = "模块开启";break;case TencentLocationListener.STATUS_GPS_AVAILABLE:desc = "GPS可用,代表GPS开关打开,且搜星定位成功";break;case TencentLocationListener.STATUS_GPS_UNAVAILABLE:desc = "GPS不可用,可能 gps 权限被禁止或无法成功搜星";break;case TencentLocationListener.STATUS_LOCATION_SWITCH_OFF:desc = "位置信息开关关闭,在android M系统中,此时禁止进行wifi扫描";break;default:break;}LogUtils.d("location status:" + s + ", " + s1 + " " + desc);
}

4、注册相关监听

//注册手势事件
tencentMap.addTencentMapGestureListener(mapGestureListener);
tencentMap.setLocationSource(this);
tencentMap.setMyLocationEnabled(true);
tencentMap.getUiSettings().setRotateGesturesEnabled(false);
//定位结果回调
tencentMap.setOnMyLocationChangeListener(onMyLocationChangeListener);private TencentMap.OnMyLocationChangeListener onMyLocationChangeListener = new TencentMap.OnMyLocationChangeListener() {@Overridepublic void onMyLocationChange(Location location) {LogUtils.d("内置定位标点击回调");if (!TextUtils.isEmpty(longitude) && !TextUtils.isEmpty(latitude)) {//传递的定位数据源Double lo = StringUtils.getDouble(longitude);Double la = StringUtils.getDouble(latitude);position = new LatLng(la, lo);longitude = null;latitude = null;} else {//GPS定位源position = new LatLng(location.getLatitude(), location.getLongitude());page = 1;}moveMap(position);presenter.setOriginLaLng(position);presenter.getNearAddress(position, page, fromMarker);}
};

setOnMyLocationChangeListener用户获取定位回调的结果,在注册TencentLocationListener接口后,调用requestLocationUpdates请求位置信息,触发onLocationChanged回调,在onLocationChanged中将事件通过mChangedListener.onLocationChanged传递给setOnMyLocationChangeListener回调。

这块有两个参数longitude、latitude是用户设置的坐标信息,如果用户传递了位置,则显示地图的中心点在该位置,否则设置当前位置的信息。

六、移动地图到中心点

private void moveMap(LatLng latLng) {//latLng中心点的坐标信息,15表示显示地图的缩放比例CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);tencentMap.animateCamera(cameraUpdate, new TencentMap.CancelableCallback() {@Overridepublic void onFinish() {}@Overridepublic void onCancel() {}});
}

七、设置Marker

marker的设置可以自定义,也可采用系统的。

private void setMarker(LatLng latLng) {//设置自定义marker样式
//        MarkerOptions markerOptions = new MarkerOptions(latLng);
//        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_location_pin));
//        markerOptions.visible(true);
//        marker = tencentMap.addMarker(markerOptions);
//        marker.setFixingPointEnable(true);//配置marker样式//HUE_BLUE:设置marker颜色为蓝色 MarkerOptions options = new MarkerOptions().icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)).position(latLng);marker = tencentMap.addMarker(options);//设置marker固定到中心点LatLng target = tencentMap.getCameraPosition().target;//坐标系转换,坐标信息转换为屏幕的中心点信息markerPoint = tencentMap.getProjection().toScreenLocation(target);marker.setFixingPointEnable(true);marker.setFixingPoint(markerPoint.x, markerPoint.y);
}

注意:marker的设置需要在位置移动之后设置,因为moveMap是带有动画的异步操作,如果moveMap没执行完毕设置marker,则设置的marker无效,不显示;如果定位后手势缩放地图,则在地图上会出现多个marker。

由于内容比较长,地图的常用基本设置就到这里结束,下篇文章介绍剩余的内容。

Android仿微信地图定位和位置选择(上)相关推荐

  1. Android仿微信地图定位和位置选择(下)

    上篇文章介绍了基本的常用功能,这边文件介绍剩余的位置信息更新.搜索.手势绑定和显示等内容. 一.获取坐标系附近的信息 1.设置默认 boolean fromMarker = false; 测距设置的标 ...

  2. Android 仿微信朋友圈拍小视频上传到服务器(转)

    界面是这个样子滴. 我也知不知道怎么给图片搞小一点o(╯□╰)o 布局文件是这样的[认真脸] <?xml version="1.0" encoding="utf-8 ...

  3. Android仿微信具有表情输入和拍照上传功能的键盘

    因公司业务要求,需要做一款类似微信聊天的页面,最主要的是表情输入和拍照.选图上传,因此仿照大神(https://github.com/dss886/Android-EmotionInputDetect ...

  4. Android 仿微信朋友圈拍小视频上传到服务器

    这个接上一个写的实现拍小视频和传到服务器的  界面是这个样子滴. 我也知不知道怎么给图片搞小一点o(╯□╰)o 布局文件是这样的[认真脸] <?xml version="1.0&quo ...

  5. Android仿微信实现快速索引选择联系人

    Android仿微信实现快速索引选择联系人 原创 2016年03月05日 13:19:20 1640 3 1 一.概述 先看效果图,然后在给大家慢慢介绍  二.实现 先给大家说说这些城市的数据是怎么来 ...

  6. android 表情键盘切换,Android仿微信键盘切换效果

    Android 仿微信的键盘切换(录音,表情,文字,其他),IM通讯,类似朋友圈只要涉及到文字等相关的app都会要涉及到键盘的处理,今天就给大家分享一下Android 仿微信的键盘切换. 效果图如下: ...

  7. android 仿微信联系人 首字母分组快速索引

    总结是一种习惯,不能停,一停人就懒了,都快一个月没有写了!该提提神了! 进入正题:android 仿微信联系人 首字母快速索引,先用下美团的索引效果图: 1.自定义View字母索引栏(右边那一列): ...

  8. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能

    最近闲来无事,随便看看各种UI实现的代码 打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置 这个实现起来其实很简单,咱们就来看看吧 最简单的Recyc ...

  9. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能.pdf

    Android仿仿微微信信朋朋友友圈圈点点击击评评论论自自动动定定位位到到相相关关行行功功能能 这篇文章主要介绍了android仿微信朋友圈点击评论自动定位到相关行功能的实现,本文图文并茂给大家介绍的 ...

  10. Android仿微信添加联系人列表,内附有截图和demo源码

    最新demo地址,仿微信添加联系人WXAddPersonDemo 分享一个Android仿微信选择联系人页面 之前做的App主要是工具类的,而且公司的产品经理也喜欢在App里设计很多自定义控件,所以比 ...

最新文章

  1. 如何实现拼音与汉字的互相转换
  2. rpgmaker mv修改_吴青峰版一点点MV 释出,唱作女帝陈珊妮执导
  3. 阿里云配置负载均衡实例
  4. JS时间戳格式化日期时间
  5. 【转贴】PLSQL不安装客户端连接远程oracle
  6. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度
  7. 远程办公从学习开始,潜伏在家,技术如何逆袭?
  8. JS 停留几秒后返回上一页
  9. atcoder 2643 切比雪夫最小生成树
  10. 吴恩达机器学习学习笔记第九章:神经网络学习
  11. codeforces 286E Ladies' Shop
  12. 全减器及其相关概念的理解
  13. 1.CLUSTERDOWN Hash slot not served
  14. (原创)数字电路设计基础 大一期末 项目 交通灯控制器设计
  15. 百度地图动态添加marker的图片显示问题
  16. 我的Blog——python封装为exe的注意事项(封装exe看这一篇基本就够了)
  17. 谷歌创始人布林申请离婚:身价930亿美元 曾出轨前妻闺蜜
  18. 联邦学习实战-2-用FATE从零实现横向逻辑回归
  19. 基金归因Brinson模型
  20. Linux 关于fork函数和sleep函数以及通信管道的一些思考

热门文章

  1. 环洋市场调研-2021年全球Camlock联轴器行业调研及趋势分析报告
  2. 有线电视与计算机网都是光缆吗,【有线电视论文】计算机管理有线电视光缆数据意义分析(共4443字)...
  3. 【PHP基础】实现PHP与SQL数据库的连接
  4. linux生成手机号码字典,字典生成器,木头超级字典生成器
  5. aac怎么转化为mp3格式?
  6. 硬盘盒刷固件使其不休眠
  7. hashcat进行rar密码破解可gpu运算
  8. ARPR软件破解带密码rar格式文件
  9. 计算机网络管理师2级,计算机网络管理员(二级)操作技能考核试卷
  10. 计算机组装与维修要学哪些,计算机组装与维修教学基本要求