安卓Kotlin接入高德定位和地图SDK
前言:高德的定位sdk可以获取设备当前的详细信息,如经纬度,具体地址(省->街道)等,
本文主要使用的是定位sdk和地图sdk中的poi搜索功能(以当前位置半径多少米内的关键词搜索)
目录
一、准备工作
1.注册高德的开发者账号
2.在控制台中创建应用,选择Android平台
3.给新建的应用添加一个key,拿到key值
二、项目
1.添加高德 Key
2.代码混淆
3.导入具体的sdk
4.地图管理类
6.在activity/fragment中使用
7.PoiItem类的属性解释
一、准备工作
1.注册高德的开发者账号
高德控制台
2.在控制台中创建应用,选择Android平台
3.给新建的应用添加一个key,拿到key值
二、项目
1.添加高德 Key
项目的 “AndroidManifest.xml” 文件中,添加如下代码:
<!--用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!--用于获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><!--用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><!--用于访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET"/><!--用于申请调用A-GPS模块--><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/><!--用于获取到poi列表后点击item后可以跳转到第三方地图软件中--><queries><package android:name="com.autonavi.minimap" /> <!-- 高德 --><package android:name="com.baidu.BaiduMap" /> <!-- 百度 --></queries><application...... ><meta-dataandroid:name="com.amap.api.v2.apikey"android:value="请输入您的用户Key"/><service android:name="com.amap.api.location.APSService"/>……
</application>
2.代码混淆
在app模块中的proguard-rules.pro文件中添加一下代码
#定位
-keep class com.amap.api.location.**{*;}
-keep class com.amap.api.fence.**{*;}
-keep class com.autonavi.aps.amapapi.model.**{*;}
#搜索
-keep class com.amap.api.services.**{*;}
3.导入具体的sdk
在app模块下的build.gradle的dependencies代码块中添加以下语句,注意我这里用的很老的版本,新版两个同时导入会有冲突,并且还有些额外的操作,如隐私合规检测等,自己根据官网学吧
//高德sdk//定位功能implementation 'com.amap.api:location:3.3.0'//搜索功能implementation 'com.amap.api:search:5.0.0'
4.地图管理类
由于我的需求只需要获取加油站和充电站,所以用了枚举,其实你可以在getPoiData()方法中的类型位置输入任何关键词的
//地图定位
object MapManger {// 定义权限请求码internal val REQUEST_CODE_LOCATION = 100//定位客户端对象var mLocationClient: AMapLocationClient? = null// 定位结果回调var locationCallback: LocationCallback? = null//当前位置的定位信息var locationInfo: LocationInfo? = null//附近的加油站列表var gasStationPoiList: ArrayList<PoiItem>? = null//附近的充电站列表var chargeStationPoiList: ArrayList<PoiItem>? = null//上次的定位成功时间var lastLocationSuccessTime = 0L//如果定位失败后,重新定位间隔时间var relocationTime = 5000Lfun init() {// 初始化定位mLocationClient = AMapLocationClient(App.app)mLocationClient!!.setLocationOption(getDefaultOption())// 设置定位回调监听mLocationClient!!.setLocationListener(object : AMapLocationListener {override fun onLocationChanged(amapLocation: AMapLocation?) {if (amapLocation != null) {if (amapLocation.errorCode == 0) {stopLocation()locationInfo = LocationInfo(amapLocation.latitude,amapLocation.longitude,amapLocation.accuracy,amapLocation.address,amapLocation.country,amapLocation.province,amapLocation.city,amapLocation.district,amapLocation.street,amapLocation.streetNum,amapLocation.cityCode,amapLocation.adCode,amapLocation.aoiName)locationCallback?.success()lastLocationSuccessTime = System.currentTimeMillis()} else {locationCallback?.failure()//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError","location Error, ErrCode:${amapLocation.getErrorCode()},errInfo:${amapLocation.getErrorInfo()}")}}}})}//开始定位fun startLocation() {try {if (mLocationClient == null) {init()}if (locationInfo == null || System.currentTimeMillis() - lastLocationSuccessTime >= 1000 * 60 * 10) {mLocationClient!!.startLocation();}} catch (e: Exception) {e.printStackTrace()}}//停止定位fun stopLocation() {try {mLocationClient?.stopLocation()} catch (e: Exception) {e.printStackTrace()}}//销毁@JvmStatic //在Java中声明为静态方法fun destroyLocation() {if (null != mLocationClient) {/*** 如果AMapLocationClient是在当前Activity实例化的,* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy*/stopLocation()mLocationClient?.onDestroy()mLocationClient = nullmLocationClient = null}}//获取poi数据fun getPoiData(context: Context,poiType: PoiType,poiSearchListener: PoiSearch.OnPoiSearchListener) {val query = PoiSearch.Query(poiType.name, "", locationInfo?.cityCode);query.setPageSize(50);// 设置每页最多返回多少条poiitemquery.setPageNum(0);//设置查询页码val poiSearch = PoiSearch(context, query);poiSearch.setOnPoiSearchListener(poiSearchListener)// 设置周边搜索的中心点(经纬度)以及半径(米)poiSearch.setBound(SearchBound(LatLonPoint(locationInfo?.latitude ?: 0.0,locationInfo?.longitude ?: 0.0), 15000));//设置周边搜索的中心点以及半径poiSearch.searchPOIAsyn()}/*** 打开系统地图选择弹窗,跳转到第三方地图的POI详情页* @param context 上下文* @param poi 包含以下字段的数据类:* id: String (高德POI ID),* name: String,* latitude: Double,* longitude: Double,* city: String? (百度地图必需)*/fun openPoiDetail(context: Context, poi: PoiItem) {val encodedName = URLEncoder.encode(poi.title, "UTF-8")val encodedAddress = URLEncoder.encode(poi.snippet ?: poi.title, "UTF-8")val mapUris = listOf(// 高德地图(使用坐标+名称方案)Uri.parse("amapuri://viewMap?" +"sourceApplication=${context.packageName}" +"&poiname=$encodedName" +"&lat=${poi.latLonPoint.latitude}" +"&lon=${poi.latLonPoint.longitude}" +"&dev=0") to "com.autonavi.minimap",// 百度地图(使用marker方案)Uri.parse("baidumap://map/marker?" +"location=${poi.latLonPoint.latitude},${poi.latLonPoint.longitude}" +"&title=$encodedName" +"&content=$encodedAddress" +"&coord_type=gcj02" +"&src=${context.packageName}") to "com.baidu.BaiduMap",// 网页版高德Uri.parse("https://uri.amap.com/marker?" +"position=${poi.latLonPoint.longitude},${poi.latLonPoint.latitude}" +"&name=$encodedName" +"&src=${context.packageName}") to null,// 网页版百度Uri.parse("https://map.baidu.com/marker?" +"location=${poi.latLonPoint.latitude},${poi.latLonPoint.longitude}" +"&title=$encodedName" +"&content=$encodedAddress" +"&autoOpen=true") to null)// 过滤可用应用val availableIntents = mapUris.mapNotNull { (uri, packageName) ->packageName?.let {Intent(Intent.ACTION_VIEW, uri).apply {`package` = packageNameaddFlags(Intent.FLAG_ACTIVITY_NEW_TASK)}.takeIf {context.packageManager.resolveActivity(it, 0) != null}} ?: Intent(Intent.ACTION_VIEW, uri)}// 启动系统选择器if (availableIntents.isNotEmpty()) {context.startActivity(Intent.createChooser(availableIntents.first(),"在地图中查看").apply {putExtra(Intent.EXTRA_INITIAL_INTENTS, availableIntents.drop(1).toTypedArray())})} else {Toast.makeText(context, "未找到可用地图应用", Toast.LENGTH_SHORT).show()}}//获取定位参数配置private fun getDefaultOption(): AMapLocationClientOption {val mOption = AMapLocationClientOption()// 可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式mOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy// 可选,设置是否gps优先,只在高精度模式下有效。默认关闭// mOption.isGpsFirst = false// 可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效mOption.httpTimeOut = 10000// 可选,设置定位间隔。默认为2秒// mOption.interval = 2000// 可选,设置是否单次定位。默认是falsemOption.isOnceLocation = true// 可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用// mOption.isOnceLocationLatest = true// 可选,设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP// AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP)// 可选// mOption.isSensorEnable = false// 可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差// mOption.isWifiScan = true// 可选,设置是否使用缓存定位,默认为truemOption.isLocationCacheEnable = false// 可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言)// mOption.geoLanguage = AMapLocationClientOption.GeoLanguage.DEFAULTreturn mOption}//检查所需权限fun checkPermissions(): Boolean {val permissions = getRequiredPermissions()return if (permissions.isNotEmpty()) false else true}fun getRequiredPermissions(): Array<String> {val permissions = mutableListOf<String>()if (!checkPermission(Manifest.permission.ACCESS_FINE_LOCATION)) {permissions.add(Manifest.permission.ACCESS_FINE_LOCATION)}if (!checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION)) {permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION)}return permissions.toTypedArray()}// 检查单个权限fun checkPermission(permission: String): Boolean {return ContextCompat.checkSelfPermission(App.app as Context,permission) == PackageManager.PERMISSION_GRANTED}data class LocationInfo(val latitude: Double, // 纬度val longitude: Double, // 经度val accuracy: Float, // 精度val address: String?, // 地址(可能为null)val country: String?, // 国家val province: String?, // 省份val city: String?, // 城市val district: String?, // 区县val street: String?, // 街道val streetNum: String?, // 门牌号val cityCode: String?, // 城市编码val adCode: String?, // 区域编码val aoiName: String? // AOI信息)interface LocationCallback {fun success()fun failure()}enum class PoiType {加油站,充电站}}
6.在activity/fragment中使用
下面是在fragment中使用,只需要把requireActivity(),requireContext()等获取上下文的方法替换为this就行
var mapManger = MapMangeroverride fun onResume() {super.onResume()if (mapManger.checkPermissions()) {mapManger.startLocation()} else {//弹出权限申请弹窗,点击确定按钮去动态申请权限,这里直接申请ActivityCompat.requestPermissions(requireActivity(),mapManger.getRequiredPermissions(),mapManger.REQUEST_CODE_LOCATION)}
}//activity的话在onCreate()中override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)mapManger.locationCallback = object : LocationCallback {override fun success() {//定位成功,获取数据getPoiData()}override fun failure() {//重新定位Handler().postDelayed({mapManger.relocationTime = mapManger.relocationTime*1.5.toLong()mapManger.startLocation()}, mapManger.relocationTime)}}//如果你有两个界面功能相似,像一个界面是加油站一个是充电站的话,由于mapManger是单例类,全局用一个对象,如果别的界面进行了定位,这个界面将不会收到回调,重新拉一次自己需要的数据if (mapManger.locationInfo!= null && mapManger.gasStationPoiList == null){//说明在别的界面进行了定位,当前界面不会触发定位成功回调,手动一次获取数据getPoiData()}}fun getPoiData(){binding.cityNameTv.text = mapManger.locationInfo?.citymapManger.getPoiData(requireContext(),MapManger.PoiType.加油站,object : OnPoiSearchListener {override fun onPoiSearched(poiResult: PoiResult?, p1: Int) {val list = poiResult?.getPois()if (!list.isNullOrEmpty()) {binding.noDataFl.visibility = View.GONEmapManger.gasStationPoiList = list//这里已经获取到列表,可以将数据填充到recyclerview中//如果要点击某项item进行跳转的话,调用mapManger.openPoiDetail()方法就行}}override fun onPoiItemSearched(p0: PoiItem?, p1: Int) {}})}
此外还应该在activity的onDestroy中调用回收方法,以回收资源,防止内存泄漏
MapManger.destroyLocation()
7.PoiItem类的属性解释
poiId //poi的ID
title //poi名称
adName //所在区的名称
snippet //区以下的详细地址 街道等
distance //距离(单位米)
photos //图片列表
tel //电话号
latLonPoint //经纬度 获取单个经度/纬度 :latLonPoint.latitude latLonPoint.longitude//其余还有一些 像 省份、城市、邮编等信息不再列举了,和管理类里的LocationInfo对象属性应该差不多
相关文章:
安卓Kotlin接入高德定位和地图SDK
前言:高德的定位sdk可以获取设备当前的详细信息,如经纬度,具体地址(省->街道)等, 本文主要使用的是定位sdk和地图sdk中的poi搜索功能(以当前位置半径多少米内的关键词搜索) 目录…...
JavaScript浅拷贝与深拷贝
目录 浅拷贝(Shallow Copy) 一、浅拷贝的定义 二、直接赋值 vs 浅拷贝 1. 直接赋值 2. 浅拷贝 三、数组的浅拷贝方法 1. slice() 2. concat() 3. 扩展运算符(...) 四、对象的浅拷贝方法 1. Object.assign() 2. 扩展运…...
智能生态之城-广东茂名
故事摘要 在中国广东茂名的未来社区,晨光中,垂直果园里发光的荔枝与智能无人机的早餐派送唤醒了城市的生活。在海底透明隧道的图书馆里,孩子们通过声控设备与虚拟生物互动。面对暴雨来临时,市民们积极参与到荔枝蜜饯制作和雨季造林…...
【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总
在 Android 开发中,我们经常需要控制 Activity 的屏幕方向,例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示,并分析常见设置无效的原因与解决方法。 一、通过…...
Android 存储路径
一、内部存储路径(Internal Storage) stats.codeSize(内部代码大小) 路径:/data/app/com.example.test-{随机后缀}/base.apk 说明:APK 安装路径,包含应用代码…...
【12】数据结构之基于线性表的排序算法
目录标题 插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 归并排序时间复杂度对比最好情况平均情况最坏情况 空间复杂度对比 插入排序 基本思想:将一个元素插入到一个有序序列中,继而得到一个有序的元素个数加一的新序列. 直接插…...
解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题
要解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题,可以使用自定义的LinearSmoothScroller,使其底部对齐屏幕。步骤如下: 创建自定义的SmoothScroller类: 继承LinearSmoothScroller并重写getVerti…...
数字世界的免疫系统:恶意流量检测如何守护网络安全
在2023年全球网络安全威胁报告中,某跨国电商平台每秒拦截的恶意请求峰值达到217万次,这个数字背后是无数黑客精心设计的自动化攻击脚本。恶意流量如同数字世界的埃博拉病毒,正在以指数级速度进化,传统安全防线频频失守。这场没有硝烟的战争中,恶意流量检测技术已成为守护网…...
十分钟机器学习之--------------线性回归
线性回归(linear regression)是一种基于数学模型的算法,首先假设数据集与标签之间存在线性关系,然后简历线性模型求解参数。在实际生活中,线性回归算法因为其简单容易计算,在统计学经济学等领域都有广泛的应…...
常用 Excel VBA 技巧,简单好学易上手
在日常办公中,我们常常会遇到各种繁琐的数据处理任务,而 Excel VBA(Visual Basic for Applications)作为一款强大的自动化工具,能够帮助我们轻松应对这些挑战。本文将介绍一些常用且简单好学的 Excel VBA 技巧…...
第7篇:Linux程序访问控制FPGA端LEDR<五>
Q:如何设计.c程序代码实现FPGA端外设LEDR流水灯? A:在DE1-SoC开发板上实现的流水灯效果:一次只点亮一个红色LED,初始状态为向左移动直至点亮LEDR9,然后改变移动的方向为向右直至点亮LEDR0,以此…...
PyTorch 深度学习实战(35):图生成模型与分子设计
在上一篇文章中,我们探讨了强化学习在机器人控制中的应用。本文将深入介绍图生成模型及其在分子设计领域的应用,这是一个结合深度学习与化学的交叉领域。我们将使用PyTorch Geometric实现基于图神经网络的分子生成模型,并在ZINC250k数据集上进…...
免费送源码:Java+ssm+HTML 三分糖——甜品店网站设计与实现 计算机毕业设计原创定制
录 摘要 1 1 绪论 3 1.1 研究背景 3 1.2 研究意义 3 1.3论文结构与章节安排 3 2系统分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1 登录流程 4 2.2.2数据删除流程 5 2.3 系统功能分析 5 2.3.1功能性分析 6 2.3.2 非功能性分析 7 2.4 系统用例分析 7 2.5本章…...
JVM 调试与内存优化实战详解
🌟 JVM 调试与内存优化实战详解 🌟 前言一、JVM 内存模型概览二、常见内存问题与诊断思路三、核心调试工具与命令详解四、实战案例一:频繁 Full GC 深度排查与优化1. 🕵️ 问题现象2. 🔬 排查流程3. ✅ 优化方案 五、实…...
Linux上通过Docker部署Zabbix6.2监控平台
文章目录 前言Zabbix概述zabbix特性 一、Zabbix架构二、主节点部署容器2.1 部署Docker 三、主节点部署数据库3.1 创建存储卷3.2 查看存储卷3.3 删除存储卷3.4 运行容器MySQL8 四、主节点部署Zabbix4.1 安装zabbix-java-gateway4.2 运行zabbix-server4.3 安装zabbix-web 五、配置…...
Grok3 API 已经免费开放了,附上免费使用 Grok3 API的教程
Grok-3是什么 Grok-3 是 xAI(由 Elon Musk 创立的 AI 公司)开发的最新大语言模型(LLM),属于 Grok 系列模型的第三代,旨在与 OpenAI 的 GPT-4、Anthropic 的 Claude 3 和 Google 的 Gemini 1.5 等顶尖 AI 竞…...
2025年4月9日-华为暑期实习-第三题-300分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 矩阵螺旋排序 问题描述 卢小姐是一家艺术展览馆的策展人,她正在为一个数字艺术展览设计一个特殊的展示方案。展览厅的墙面是一个 N N N \times N...
【Web API系列】WebSocketStream API 深度实践:构建高吞吐量实时应用的流式通信方案
前言 在当今的 Web 开发领域,实时通信已成为许多应用的核心需求。无论是即时聊天、实时数据仪表盘,还是在线游戏和金融交易系统,都需要高效的双向数据传输能力。传统的 WebSocket API 为此提供了基础支持,但在处理大规模数据流、…...
WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网不回显
目录 1. RCE执行-5大类函数调用 1.1 Runtime方式 1.2 Groovy执行命令 1.3 脚本引擎代码注入 1.4 ProcessImpl 1.5 ProcessBuilder 2. JNDI注入(RCE)-RMI&LDAP&高版本 2.1 RMI服务中的JNDI注入场景 2.2 LDAP服务中的JNDI注入场景 攻击路径示例&#…...
在android实现Google的web登录
前言 由于业务上的需要,想要在android端实现Google登录。但是android的原生方法受到限制,实现起来比较麻烦。于是想到了一个曲线救国的方法,在android端使用Google的web登录。 实现逻辑 在andorid端拉起外部浏览器,用户登录Google账号,登录成功后,再将登录信息返回到a…...
opencv常用边缘检测算子示例
opencv常用边缘检测算子示例 1. Canny算子2. Sobel算子3. Scharr算子4. Laplacian算子5. 对比 1. Canny算子 从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,检测算法可以分为以下5个步骤: 噪声过滤(高斯滤波&…...
安装了VM Tools,仍无法复制拖动-解决方案
今天在安装ubuntu时遇到了困扰许久的问题,安装了VM Tools,仍无法拖动主机文件到虚拟机,主要有两种原因并对应解决办法。 1.相关虚拟机设置选项卡中-客户机隔离-两个功能没有勾选 解决方案:勾选重启虚拟机即可 2.(这个…...
一文读懂WPF布局
WPF布局 布局WPF 布局的核心机制常用布局控件详解Grid(网格布局)StackPanel(堆叠布局)DockPanel(停靠布局)WrapPanel(自动换行布局)Canvas(绝对定位布局)Unif…...
【Docker基础-网络】--查阅笔记4
目录 Docker 网络网络类型none 网络host 网络bridge 网络自定义网络 容器间通信IP 通信Docker DNS Serverjoined 容器 容器与外部通信容器访问外部外部访问容器 Docker 网络 学习Docker提供的几种原生网络如何创建自定义网络容器间通信,容器于外界交互 Docker 安装…...
FacialExpressionDetection的conda虚拟环境搭建Window
安装conda的URL:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 清华源下载conda版本,哪个最新用哪个,这里下载Anaconda3-5.3.1-Windows-x86_64.exe版本 安装conda虚拟环境 conda create --name py1…...
IPD推进中关键角色与岗位(七)LTDT确保技术开发的实用性与可靠性,满足市场需求
IPD 体系作为一种先进的研发管理模式,其核心在于打破传统职能部门的壁垒,通过跨部门团队的协同合作,实现产品开发的全流程优化。在 IPD 体系的架构中,存在着多个关键团队,它们各司其职又紧密配合,共同推动产…...
c++自学笔记——字符串与指针
字符串与指针 1. 字符串基础 字符串的定义:字符的序列,通常用来表示文本。 字符串字面量(String Literal)是在程序中直接用双引号括起来的文本序列。字符串字面量的类型是 const char*,即指向字符常量的指针。字符串…...
Jmeter分布式测试启动
代理客户端配置 打开jmeter.properties文件,取消注释并设置端口(如server_port1099), 并添加server.rmi.ssl.disabletrue禁用SSL加密。 (Linux系统)修改jmeter-server文件中的RMI_HOST_DEF为代理机实际IP。…...
.DS_Store文件泄露、.git目录泄露、.svn目录泄露漏洞利用工具
🐉工具介绍 一款图形化的 .DS_Store文件泄露、.git目录泄露、.svn目录泄露漏洞利用工具。 🎯使用 本工具使用Python3 PyQt5开发,在开始使用前,请确保已经安装了相关模块: pip3 install -r requirements.txt -i ht…...
Coze+大模型智能体环境搭建
1 前言 Coze作为字节跳动推出的新一代AI Bot开发平台,为开发者提供了快速构建、部署智能对话代理的一站式解决方案。Coze平台通过提供可视化工作流编排、知识库集成、插件扩展等核心功能,结合一些大模型,例如豆包、deepseek、通义千问等大模型…...
计算机视觉与深度学习 | 视觉SLAM学习思路总结与视觉SLAM发展历程(1986年至2025年)
视觉SLAM(Simultaneous Localization and Mapping,同时定位与建图)是计算机视觉和机器人领域的重要研究方向,涉及数学、几何、优化、传感器融合等多学科知识。以下是学习视觉SLAM的系统化思路总结,适合从入门到进阶的学习路径:视觉SLAM学习思路总结 一、基础准备 数学基…...
Ansible(8)——循环与条件任务
目录 一、循环迭代任务: 1、简单循环: 2、循环字典列表: 3、Ansible 2.5 之前的循环关键字: 4、在循环中使用 register 变量: 二、条件任务: 1、使用条件句的常见场景: 2、条件任务语法…...
搭建Trae+Vue3的AI开发环境
从2024年2025年,不断的有各种AI工具会在自媒体中火起来,号称各种效率王炸,而在AI是否会替代打工人的话题中,程序员又首当其冲。 作为一个后端开发,这篇文章基于Trae工具,来创建和运行一个简单的Vue前端应用…...
【免费公测】可遇AI直播/无人直播/矩阵直播/AI场控
前言 经过了一个多月的内测打磨,实现了非常稳定的无人直播效果,AI直播语音及其真实,软件交互方便,可以快速的构建AI直播间。 免费公测,内置无限激活卡密一张,打开即用。 亮点 高仿真语音模型,…...
大数据Hadoop(MapReduce)
MapReduce概述 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上…...
使用apache-jmeter时,控制台打不开应用的解决方法
运行jmeter.bat的时候,提示: findstr 不是内部或外部命令,也不是可运行的程序 或批处理文件。 Not able to find Java executable or version. Please check your Java installation. errorlevel2这个错误信息表明系统无法识别 findstr 命令…...
leetcode 74. 搜索二维矩阵
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length;int n matrix[0].length;int l 0;int r n * m - 1; // 记得减一while (l < r) {int mid (l r) / 2;if(matrix[mid / n][mid % n] > target) {r mid - 1;} else if…...
函数式编程在 Java:Function、BiFunction、UnaryOperator 你真的会用?
大家好,我是你们的Java技术博主!今天我们要深入探讨Java函数式编程中的几个核心接口:Function、BiFunction和UnaryOperator。很多同学虽然知道它们的存在,但真正用起来却总是不得要领。这篇文章将带你彻底掌握它们!&am…...
SpringMVC基础一(SpringMVC运行原理)
先了解MVC,在JavaWeb基础五中。 回忆servlet,在javaweb基础二中。 创建一个web项目: 1、新建maven项目,导入依赖。(junit、springmvc、spring-webmvc、servlet-api、jsp-api、jstl) <groupId>org…...
libva之ffavdemo分析
ffavdemo 代码库实现了一个基于FFmpeg和VAAPI的硬件加速视频解码与渲染框架,主要用于演示视频解码与渲染的完整硬件加速流程。支持多种渲染后端(X11、DRM、EGL),适应不同显示环境。包含视频处理过滤器,可进行格式转换和…...
从零开始写android 的智能指针
Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),源码中的位置在system/core/include/utils/StrongPointer.h。另外一种是弱指针(weak pointer)。其实称之为强引用和弱引用更合适一些。强…...
Spark-SQL 之 Window
window 函数实例 select concat(substr(p_dt,1,4),substr(p_dt,6,2)...
Python设计模式-单例模式
一、单例模式核心思想 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。该模式主要解决以下问题: 资源控制(如数据库连接池)配置信息全局一…...
富文本编辑器的内容导出html,并保留图片
富文本编辑器的上传的图片默认转为base64,但是如果需要保存到数据库,base64的数据就太大了,所以一般都会长传到文件服务器,然会返回图片url。 但是当我们需要把富文本编辑器的内容导出为html时,因为图片时url,当浏览器…...
jQueryHTML与插件
1.jQuery 事件机制 1.1 注册事件 bind()、on()方法向被选元素添加一个或多个事件处理程序,以及当事件发生时运行的函数 $("p").on({"click": function () {alert("点击了")},"mouseenter": function () {…...
KTH5772 系列游戏手柄摇杆专用3D 霍尔位置传感器
产品概述 KTH5772是一款专为游戏手柄上的摇杆应用而设计的3D霍尔磁感应芯片,主要面向对线性度、回报率、灵敏度、功耗要求严格的摇杆应用。KTH5772基于3D霍尔技术,内部分别集成了X轴、Y轴和Z轴三个独立的霍尔元件,能够通过测量和处理磁通密度…...
C++进阶——C++11_右值引用和移动语义_可变参数模板_类的新功能
目录 1、右值引用和移动语义 1.1 左值和右值 1.2 左值引用和右值引用 1.3 引用延长生命周期 1.4 左值和右值的参数匹配 1.5 右值引用和移动语义的使用场景 1.5.1 左值引用主要使用场景 1.5.2 移动构造和移动赋值 1.5.3 右值引用和移动语义解决传值返回问题 1.5.4 右值…...
(五)深入了解AVFoundation-播放:多音轨、字幕、倍速播放与横竖屏切换
引言 在之前的博客中,我们已经实现了一个相对完整的播放器,具备了基本功能,如播放、暂停、播放进度显示和拖拽快进等。这为我们提供了一个坚实的基础。接下来,我们将进一步扩展播放器的功能,使其更具灵活性和实用性&a…...
matplotlib.pyplot常见图形及组合基础用法文档
matplotlib.pyplot 常见图形及组合基础用法文档 一、引言 matplotlib.pyplot 是 Python 中用于数据可视化的强大库,提供了丰富的绘图函数,可绘制折线图、散点图、柱状图等多种类型的图形。同时,还能将不同类型的图形组合在一起,…...
mysql的基础语句和外键查询及其语句
思路:双指针思路可以吗,我就直接找G,如果后一个是1就cnt,如果不是数字,用一个指针i指向G,另一个指针j移动,当不是G时停止,统计G的个数,如果是奇数个同时G的下一个是1,cnt…...