Android仿微信地图定位和位置选择(上)

article/2025/10/21 0:35:34

一、地图集成

        集成腾讯地图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。

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


http://chatgpt.dhexx.cn/article/dl3sFvu4.shtml

相关文章

微信公众号h5界面获取展示微信内置地图与地图坐标间的转换 — 微信地图(gcj02)转为百度地图

此文章中实例用测试号进行演示 。getLocation openLocation 主要运用微信JS-SDK&#xff0c;微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK&#xff0c;网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能…

微信小程序地图功能

一&#xff0c;显示地图 <map id"map" longitude"{{longitude}}" latitude"{{latitude}}" scale"14" controls"{{controls}}" bindcontroltap"controltap" markers"{{markers}}" bindmarkertap"…

微信小程序---高德地图API

本文章介绍微信小程序调用高德地图API的过程&#xff0c;使用高德定位功能做演示。微信小程序目前支持百度地图、高德地图、腾讯地图。用法可以说是基本完全一样&#xff0c;本文章以高德为例&#xff0c;简单说一下他们的区别&#xff0c;高德地图精度应该是最准确的&#xff…

微信小程序地图控件Map的使用

本文介绍微信小程序map控件的使用 map为原生控件之一…… 介绍完map控件之后下面直接来看代码怎么实现吧 和往常一样&#xff0c;这些代码贴过去就可以直接通用的 首先wxml文件(极简)&#xff1a; <map id"map" scale"16" controls"{{controls}}&…

微信小程序地图导航实例讲解

微信小程序地图导航实例讲解 先上演示视频准备工作如下在app.json中添加 watch页面代码watch.wxmlwatch.wxsswatch.js connect导航页面使用在腾讯位置服务需要获取key地图选点当用户未点击选址时&#xff0c;默认传入用户当前地址&#xff0c;可以在onShow方法中定义 代码解读 …

微信小程序——地图(定位,多个标记点)

效果图 指定为位置 Page({data: {longitude: 113.14278, //地图界面中心的经度latitude: 23.02882, //地图界面中心的纬度markers: [ //标志点的位置//位置0{id: 0,iconPath: "../images/1.png",latitude: 23.04308268848755,longitude: 113.13562655285273,width: …

Poi读取Excel时的日期操作(原创)

在java读取excel获取数据存入数据库时&#xff0c;经常会遇到多种日期类型和时间类型混用的情况 比如这样&#xff0c;一边是纯日期&#xff0c;一边是“年月日 时分秒”形式&#xff0c; 很多时候我们需要直接根据内容来区分二者&#xff0c;从而将取到的时间值转换成与excel…

Java用poi实现读取Excel文件内容

使用poi读取Excel文件 前言 用户可以直接读取本地文件&#xff0c;也可以通过上传文件的形式读取excel 注意&#xff1a;poi对于读取到空白行的时候&#xff0c;会默认的认为是最后一行&#xff0c;将不会再读取空白行下面的数据 第一步 导入依赖 <dependency><gro…

使用poi读取Excel中的数据到数据库

大家好今儿给大家带来的是使用poi读取Excel中的数据到数据库 目录 大家好今儿给大家带来的是使用poi读取Excel中的数据到数据库1.poi简单介绍2.poi操作excel3.代码部分(可直接用)4.测试5.总结 1.poi简单介绍 POI是Apache出品的一个开源的专门用来操作我们Microsoft Office格式…

POI读取Excel浅谈

POI读取Excel浅谈 博客分类&#xff1a; J2EEJava开源Servlet/Jsp设计模式 Excel Ruby Office Apache Microsoft 先看代码&#xff0c;挨句解释&#xff1a; 一般遍历使用两种方式&#xff0c;1&#xff1a;得到总的行数和每行的列数&#xff0c;然后循环。2&#xff1a;使用…

【Java】POI读取Excel的两种模式

用户模式 基本使用 usermodel相关包&#xff0c;对用户友好&#xff0c;在ss包下有统一的接口&#xff0c;但它是把整个文件读取到内存中&#xff0c;对于大量数据很容易内存溢出&#xff0c;所以只能用来处理小量数据 示例代码 public static List<Map<String, Stri…

使用POI读取EXCEL中的所有Sheet表

使用POI读取EXCEL中的所有Sheet表 最近接触到了多sheet页的导入导出功能&#xff0c;现举例如何 使用POI&#xff0c;通过多个循环读取EXCEL中的所有Sheet表内容。 package poitest; import java.io.File; import java.io.FileInputStream; import org.apache.poi.hssf.u…

poi读取Excel文档(.xls .xlsx)包含合并单元格

例子&#xff1a; 结果&#xff1a; 开始&#xff1a;----------------------------------- 导入的poi <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</ar…

Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)

Java教程&#xff1a;使用POI读取excel文档&#xff08;根据BV1bJ411G7Aw整理&#xff09; 最近公司需要我做一个导出Excel表格的功能&#xff0c;为此来学习一下POI&#xff0c;在这里记录一下学习笔记。B站直接搜BV1bJ411G7Aw就能找到视频。 一、简介 poi如何操作表格 二…

poi读取excel模板,并填充数据

一、POI介绍 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能&#xff1a; HSSF &#xff0d; 提供读写Microsoft Excel格式档案的功能。 XSSF &#xff0d; 提供读写Microsoft Excel OOXM…

java使用poi操作读取Excel文件

在上代码之前首先说说Excel文件的一些名词 工作区workbook&#xff1a;可以理解为一个Excel文件&#xff0c;比如LinkL.xlsx文件 表sheet&#xff1a;一个.xlsx文件中的不同表 行row&#xff1a;表中的一行数据 单元格cell&#xff1a;每一行中的每一个数据就是单元格 附&…

使用Java通过POI读取EXCEL中的数据

这里有个Excel&#xff0c;怎么使用java读取excel中的数据呢&#xff1f; 文件存放位置&#xff1a; 首先引入poi的jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></…

使用POI读取excel文件内容

1.前言 项目中要求读取excel文件内容&#xff0c;并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。 2.代码实例&#xff1a; package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.Fi…

使用POI读取Excel文件

使用POI读取Excel文件 一、前言 用户可以通过上传excel文件&#xff0c;后端通过读取excel文件的内容并将内容写入数据库中以便更好的使用。 本文档使用的excel的工具类既可以读取有合并单元格的文件也可以读取没有合并单元格的文件&#xff0c;并且读取到单元格的数据进行了…

POI读写Excel的基本使用

一、Excel导入导出的应用场景 1、数据导入&#xff1a;减轻录入工作量 2、数据导出&#xff1a;统计信息归档 3、数据传输&#xff1a;异构系统之间数据传输 二、POI简介&#xff08;Apache POI&#xff09; 1、什么是POI Apache POI是Apache软件基金会的开放源码函式库&…