当前位置: 首页 > article >正文

自封装|地图组件,基于腾讯地图Api开发。支持地址选点,地址搜索,双向解析,轨迹播放(个人学习记录)

在index.html文件中导入腾讯地图的组件apiscript srchttps://map.qq.com/api/gljs?v1.expkey输入你的KEY/script创建文件components/map/index.vuetemplate div styleposition: relative; div v-if!mapLoaded classloadingPage div classloading loader / /div !-- 控制台 -- div v-ifsearchShow mapLoaded classcontrol el-autocomplete v-modelsearchAddress classinline-input :fetch-suggestionsquerySearch placeholder请输入市区名地名 clearable :trigger-on-focusfalse inputinputAddress selectsearch click.native.stop / el-button :disabledisDisabled click.stopsearch 搜索地址/el-button /div div v-ifmapType route mapLoaded classcontrol div classitem div classlabel播放速度:/div el-input-number v-modelspeedNum :min1 :max999 label播放速度 changespeedChange / el-button stylemargin-left: 20px; click.stopspeedChange(10) 10倍速/el-button el-button click.stopspeedChange(100)100倍速/el-button el-button click.stopspeedChange(999)1000倍速/el-button /div /div !-- 地图容器 -- div idqqmap :stylewidth: width ;height: height ; / /div /template script import { addressResolution, addressInverseResolution, keywordAssociation } from ./mapApi export default { props: { width: { type: String, default: 100% }, height: { type: String, default: 100% }, // 启用点击事件 clickEvent: { type: Boolean, default: false }, // 启用搜索功能 searchShow: { type: Boolean, default: false } }, data() { return { mapType: null, mapLoaded: false, // 地图是否加载完成 map: null, // 地图对象实例 center: null, // 地图中心点 maker: null, // 标记点实例 markGeo: [], // 点标记列表 polylineLayer: null, path: [], // 初始化地图数据 location: { lng: undefined, // 经度 lat: undefined // 纬度 }, // 轨迹开始坐标 startLocation: { lng: undefined, // 经度 lat: undefined // 纬度 }, // 轨迹结束坐标 endLocation: { lng: undefined, // 经度 lat: undefined // 纬度 }, searchAddress: , // 地址搜索数据 searchList: undefined, // 地址搜索结果 isDisabled: true, // 搜索按钮是否禁用 province: undefined, // 省 city: undefined, // 市 district: undefined, // 区 addressValue: undefined, // 详细地址 speedNum: 1 } }, created() { }, methods: { launch(res, type) { if (type point) { this.mapType point this.getLocation(res) // 初始化经纬度 } else if (type route) { this.mapType route this.getLocationRoute(res) // 初始化经纬度 } if (!this.mapLoaded) { this.initMap() // 初始化地图 } }, devastate() { this.speedNum 1 this.map.destroy() this.mapLoaded false }, // 地图初始化 initMap() { // 定义地图中心点坐标 this.center new window.TMap.LatLng( this.location.lat, this.location.lng ) // 定义map变量调用 TMap.Map() 构造函数创建地图 this.map new window.TMap.Map(document.getElementById(qqmap), { center: this.center, // 设置地图中心点坐标 zoom: 17.2, // 设置地图缩放级别 pitch: 43.5, // 设置俯仰角 rotation: 45, // 设置地图旋转角度 viewMode: 3D // 设置地图展示形式 默认3D }) if (this.$props.clickEvent) { this.map.on(click, this.clickHandler) // 添加地图点击事件 } // 创建点标记 if (this.mapType point) { this.markGeo [ { id: 1, // 点标记唯一标识后续如果有删除、修改位置等操作都需要此id styleId: myStyle, // 指定样式id position: new window.TMap.LatLng( this.location.lat, this.location.lng ) } ] } else if (this.mapType route) { this.markGeo [ { id: car, styleId: car-down, position: new window.TMap.LatLng( this.location.lat, this.location.lng ) }, { id: start, styleId: start, position: new TMap.LatLng( this.startLocation.lat, this.startLocation.lng ) }, { id: end, styleId: end, position: new TMap.LatLng( this.endLocation.lat, this.endLocation.lng ) } ] } this.maker new window.TMap.MultiMarker({ map: this.map, // 绑定地图对象 styles: { car-down: new TMap.MarkerStyle({ width: 40, height: 40, anchor: { x: 20, y: 20 }, faceTo: map, rotate: 0, src: https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/car.png }), start: new TMap.MarkerStyle({ width: 25, height: 35, anchor: { x: 16, y: 32 }, src: https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/start.png }), end: new TMap.MarkerStyle({ width: 25, height: 35, anchor: { x: 16, y: 32 }, src: https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/end.png }) }, geometries: this.markGeo // 点标记数据 }) // 添加路线轨迹 if (this.mapType route) { this.polylineLayer new TMap.MultiPolyline({ map: this.map, // 绘制到目标地图 // 折线样式定义 styles: { style_route: new TMap.PolylineStyle({ color: #3777FF, // 线填充色 width: 5, // 折线宽度 borderWidth: 1, // 边线宽度 borderColor: #eee, // 边线颜色 lineCap: round // 线端头方式 }) }, geometries: [{ styleId: style_route, paths: this.path }] }) this.maker.moveAlong({ car: { path: this.path, speed: 888 * this.speedNum } }, { autoRotation: true }) } this.mapLoaded true console.log(地图加载完成) }, // 单点地图数据初始化 getLocation(res) { this.location.lng res.longitudeX this.location.lat res.latitubeY if (this.mapLoaded) { // 设置标记点 this.setMaker(this.location.lat, this.location.lng) // 移动地图中心点 this.map.setCenter(new TMap.LatLng(this.location.lat, this.location.lng)) } }, // 地图点击事件 clickHandler(evt) { this.location.lat evt.latLng.getLat().toFixed(6) // 获取纬度 this.location.lng evt.latLng.getLng().toFixed(6) // 获取经度 // 设置标记点 this.setMaker(this.location.lat, this.location.lng) // 地址逆解析 addressInverseResolution(this.location.lat , this.location.lng).then(res { this.addressValue res.result.address this.province res.result.address_component.province this.city res.result.address_component.city this.district res.result.address_component.district // 传递地址数据 this.postAddressData() }) }, // 设置标记点 setMaker(latitude, longitude) { // 修改标记点 this.maker.updateGeometries({ id: 1, // 点标记唯一标识后续如果有删除、修改位置等操作都需要此id styleId: myStyle, // 指定样式id position: new window.TMap.LatLng( latitude, longitude ) }) }, // 搜索地址 search() { // 地址解析 addressResolution(this.searchAddress).then(res { const searchOption this.searchList.find(f f.result.title this.searchAddress) if (res.message ! Success) { if (searchOption searchOption.result.title ! this.searchAddress) { this.$message({ message: 请注意搜索格式是否正确, type: error, duration: 2000, offset: 70 }) return } else if (searchOption searchOption.result.title) { res searchOption } } // 设置标记点 this.setMaker(res.result.location.lat, res.result.location.lng) // 移动地图中心点 this.map.setCenter(new TMap.LatLng(res.result.location.lat, res.result.location.lng)) // 获取详细地址信息 this.addressValue res.result.title this.province res.result.address_components.province this.city res.result.address_components.city this.district res.result.address_components.district // 传递地址数据 this.postAddressData() }) }, // 查询联想词 querySearch(queryString, cb) { keywordAssociation(queryString).then(({ data }) { for (var i 0; i data.length; i) { data[i].value data[i].title } this.searchList data.map(m { const location m.location const title m.title const province m.province const district m.district const city m.city const address_components { province, district, city } const searchOption { result: { title, location, address_components }} return searchOption }) cb(data) }) }, // 判断输入地址是否为空 inputAddress(value) { if (value) { this.isDisabled false } else { this.isDisabled true } }, // 传递地址数据 postAddressData() { // this.$emit(postAddress, { // province: this.province, // city: this.city, // district: this.district, // addressValue: this.addressValue, // latitubeY: this.location.lat, // longitudeX: this.location.lng // }) }, // 路径地图数据初始化 getLocationRoute(res) { // 获取起点坐标信息 this.startLocation.lng res[0].longitudeX this.startLocation.lat res[0].latitudeY // 获取终点坐标信息 this.endLocation.lng res[res.length - 1].longitudeX this.endLocation.lat res[res.length - 1].latitudeY const LastPosition res[0]// 最新的坐标信息 this.location.lng LastPosition.longitudeX this.location.lat LastPosition.latitudeY console.log(this.endLocation); console.log(this.startLocation); res.forEach(item { this.path.push(new TMap.LatLng(item.latitudeY, item.longitudeX)) }) if (this.mapLoaded) { // 移动地图中心点 this.map.setCenter(new TMap.LatLng(this.location.lat, this.location.lng)) } }, speedChange(num) { if (num) { this.speedNum num } this.maker.moveAlong({ car: { path: this.path, speed: 800 * this.speedNum } }, { autoRotation: true }) } } } /script style langscss scoped .control { position: absolute; top: 10px; left: 10px; z-index: 1999; .item { display: flex; align-items: center; .label { font-size: 16px; color: #666; margin-right: 10px; } } } .loadingPage { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 3999; .loading { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } } keyframes rotation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .loader { width: 48px; height: 48px; border: 5px solid #00afee; border-bottom-color: #90cf5b; border-radius: 50%; -webkit-animation: rotation 1s linear infinite; animation: rotation 1s linear infinite; } /style创建文件components/map/map_api.js// 地址解析 export function addressResolution(address) { return new Promise(function(resolve, reject) { window.handleResponse function(data) { resolve(data) } const url https://apis.map.qq.com/ws/geocoder/v1/?address address key输入你的KEYoutputjsonpcallbackhandleResponse var script document.createElement(script) script.src url document.body.appendChild(script) }) } // 地址逆解析 export function addressInverseResolution(location) { return new Promise(function(resolve, reject) { window.handleResponse function(data) { resolve(data) } const url https://apis.map.qq.com/ws/geocoder/v1/?location location key输入你的KEYoutputjsonpcallbackhandleResponse var script document.createElement(script) script.src url document.body.appendChild(script) }) } // 关键词联想 export function keywordAssociation(keyword) { return new Promise(function(resolve, reject) { window.handleResponse function(data) { resolve(data) } const url https://apis.map.qq.com/ws/place/v1/suggestion?keyword keyword key输入你的KEYoutputjsonpcallbackhandleResponsepolicy1 var script document.createElement(script) script.src url document.body.appendChild(script) }) }调用方式template div el-button typeprimary clickhandleOpen打开地图/el-button el-button typeprimary clickhandlePlay播放轨迹/el-button el-drawer :visible.syncdrawerShow directionbtt :before-closehandleClose wrapperClosable size800px :with-headerfalse TXmap refTXmapRef :height797px :clickEventtrue :searchShowtrue / /el-drawer /div /template script // 引入地图组件 import TXmap from /components/TXmap; export default { components: { TXmap, }, data() { return { // 是否显示弹出层 drawerShow: false, }; }, methods: { async handleOpen() { // 打开弹窗 this.drawerShow true; // 加载地图数据 const data { longitudeX: 116.397477, latitubeY: 39.908692, }; this.$nextTick(() { this.$refs.TXmapRef.launch(data, point); //加载地图数据 单点标记 }); }, handlePlay() { // 打开弹窗 this.drawerShow true; // 加载地图数据 const data [ {longitudeX:116.30571126937866,latitudeY:39.98481500648338}, {longitudeX:116.30596876144409,latitudeY:39.982266575222155}, {longitudeX:116.3111400604248,latitudeY:39.982348784165886}, {longitudeX:116.3111400604248,latitudeY:39.978813710266024}, {longitudeX:116.31699800491333,latitudeY:39.978813710266024}, ]; this.$nextTick(() { this.$refs.TXmapRef.launch(data, route); //加载地图数据 播放轨迹 }); }, handleClose() { // 关闭弹窗 this.drawerShow false; this.$refs.TXmapRef.devastate(); //销毁地图 }, }, }; /script

相关文章:

自封装|地图组件,基于腾讯地图Api开发。支持地址选点,地址搜索,双向解析,轨迹播放(个人学习记录)

在index.html文件中导入腾讯地图的组件api<script src"https://map.qq.com/api/gljs?v1.exp&key<输入你的KEY>"></script>创建文件components/map/index.vue<template><div style"position: relative;"><divv-if&qu…...

Arduino轻量级嵌入式CLI框架VORTEX设计与应用

1. VORTEX项目概述VORTEX&#xff08;Versatile Onboard Real Time Executor CLI for Arduino&#xff09;是一个专为Arduino平台设计的轻量级、可定制化嵌入式命令行接口&#xff08;CLI&#xff09;运行时框架。它并非通用型Shell&#xff0c;而是面向资源受限微控制器的实时…...

黄仁勋把Token、智能体和万亿美元周期串起来了

作者&#xff5c;YaraGTC大会前两周的旧金山&#xff0c;在摩根士丹利TMT大会上&#xff08;Morgan Stanley 2026 Technology, Media & Telecom Conference&#xff09;&#xff0c;黄仁勋与摩根士丹利联合主席Dan Simkowitz进行了一场炉边对话。这场对话值得复盘&#xff…...

SQL Murder Mystery:用SQL揭开案件真相的教育游戏

SQL Murder Mystery&#xff1a;用SQL揭开案件真相的教育游戏 【免费下载链接】sql-mysteries Inspired by veltmans command-line mystery, use SQL to research clues and find out whodunit! 项目地址: https://gitcode.com/gh_mirrors/sq/sql-mysteries 项目价值&am…...

LIS3MDL磁力计驱动库深度解析:寄存器级嵌入式实践

1. LIS3MDL磁力计库技术解析&#xff1a;面向嵌入式工程师的深度实践指南1.1 芯片级认知&#xff1a;LIS3MDL的物理本质与工程定位LIS3MDL是意法半导体&#xff08;STMicroelectronics&#xff09;推出的高精度、低功耗三轴磁力计&#xff0c;采用MEMS工艺制造&#xff0c;专为…...

Ollama本地模型全攻略:从下载到Python调用,手把手教你玩转千问2

Ollama本地模型全攻略&#xff1a;从下载到Python调用&#xff0c;手把手教你玩转千问2 在人工智能技术快速发展的今天&#xff0c;本地运行大型语言模型已成为许多开发者和技术爱好者的新选择。Ollama作为一个轻量级的本地模型运行工具&#xff0c;让用户能够轻松下载和管理各…...

嵌入式OLED驱动库:SSD1306/SH1106轻量级显示解决方案

1. 项目概述Oled_display_128x64是一款面向嵌入式系统的轻量级单色 OLED 显示驱动库&#xff0c;专为 SSD1306、SH1106 等主流 12864 像素 IC/SPI 接口 OLED 屏模组设计。该库不依赖操作系统&#xff0c;可无缝集成于裸机&#xff08;Bare-metal&#xff09;或 RTOS&#xff08…...

Apache Storm并行度优化终极指南:如何最大化利用集群计算能力

Apache Storm并行度优化终极指南&#xff1a;如何最大化利用集群计算能力 【免费下载链接】storm Apache Storm 项目地址: https://gitcode.com/gh_mirrors/storm26/storm Apache Storm是一个分布式实时计算系统&#xff0c;专门处理无界数据流。在Storm中&#xff0c;并…...

传导发射超标综合整改实操指南

一、传导发射超标整改&#xff0c;为什么要先定位再动手&#xff1f;盲目整改有什么危害&#xff1f;问&#xff1a;很多工程师遇到传导发射超标&#xff0c;就盲目加滤波器、换屏蔽线&#xff0c;结果越改越乱&#xff0c;甚至损坏设备&#xff0c;正确的整改逻辑应该是什么&a…...

零基础玩转LingBot深度估计:5分钟部署,一键生成3D场景图

零基础玩转LingBot深度估计&#xff1a;5分钟部署&#xff0c;一键生成3D场景图 1. 引言&#xff1a;让平面照片变3D的神奇工具 你是否曾经想过&#xff0c;如何让一张普通的平面照片瞬间变成包含深度信息的3D场景&#xff1f;今天我要介绍的LingBot深度估计模型&#xff0c;…...

3步解决GB/T 7714-2015格式难题:让参考文献编辑效率提升80%

3步解决GB/T 7714-2015格式难题&#xff1a;让参考文献编辑效率提升80% 【免费下载链接】Chinese-STD-GB-T-7714-related-csl GB/T 7714相关的csl以及Zotero使用技巧及教程。 项目地址: https://gitcode.com/gh_mirrors/chi/Chinese-STD-GB-T-7714-related-csl 一、问题…...

PDF补丁丁完整指南:掌握全能PDF编辑工具的终极教程

PDF补丁丁完整指南&#xff1a;掌握全能PDF编辑工具的终极教程 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱&#xff0c;可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档&#xff0c;探查文档结构&#xff0c;提取图片、转成图片等等 项目地址: https://gitco…...

TensorFlow多类支持向量机终极指南:一对多策略实现详解

TensorFlow多类支持向量机终极指南&#xff1a;一对多策略实现详解 【免费下载链接】tensorflow_cookbook Code for Tensorflow Machine Learning Cookbook 项目地址: https://gitcode.com/gh_mirrors/te/tensorflow_cookbook TensorFlow多类支持向量机&#xff08;SVM&…...

5步焕新你的旧设备:OpenCore Legacy Patcher全攻略

5步焕新你的旧设备&#xff1a;OpenCore Legacy Patcher全攻略 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 老旧Mac升级不再是难题&#xff01;OpenCore Legacy Patche…...

最近在折腾海康威视工业相机的二次开发,发现网上针对多相机管理的C#案例确实不多。直接上干货,分享几个关键点和踩过的坑

海康威视相机二次开发&#xff0c;SDK开发&#xff08;多个相机&#xff09;&#xff0c;用C#语言写的,提供源码 先上段初始化SDK的基础代码&#xff1a; // 引用海康SDK的DLL [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_Init();public bool …...

CentOS7断电后卡在登录界面?三步搞定XFS文件系统修复(附SELinux避坑指南)

CentOS7异常断电后XFS文件系统修复实战指南 1. 问题现象与诊断方法 当CentOS7服务器遭遇异常断电后&#xff0c;常见的故障表现为系统卡在图形登录界面或无法正常启动服务。通过CtrlAltF1切换至终端界面&#xff0c;通常会看到类似"XFS corruption detected"的错误提…...

手把手教你用HY-MT1.5-1.8B:GGUF版本Ollama部署,小白也能搞定

手把手教你用HY-MT1.5-1.8B&#xff1a;GGUF版本Ollama部署&#xff0c;小白也能搞定 1. 准备工作&#xff1a;了解你的翻译小助手 HY-MT1.5-1.8B是一款来自腾讯混元的轻量级翻译模型&#xff0c;虽然只有18亿参数&#xff0c;但翻译效果却能媲美那些体积大几十倍的模型。最厉…...

Apache OpenWhisk错误处理终极指南:如何优雅应对各种异常场景

Apache OpenWhisk错误处理终极指南&#xff1a;如何优雅应对各种异常场景 【免费下载链接】openwhisk Apache OpenWhisk is an open source serverless cloud platform 项目地址: https://gitcode.com/gh_mirrors/openw/openwhisk Apache OpenWhisk作为一款开源的无服务…...

低延迟小智AI服务端搭建-TTS实战:在线API选型与首帧优化

1. 在线TTS API选型实战指南 第一次接触在线TTS服务时&#xff0c;我被五花八门的API选项搞得晕头转向。经过半年多的实战踩坑&#xff0c;终于摸清了主流平台的特性差异。目前市场上最值得关注的两大平台是阿里百炼和火山引擎&#xff0c;它们各有特色&#xff0c;适合不同场景…...

Janus-Pro-7B部署教程:conda环境复现与py310兼容性验证步骤

Janus-Pro-7B部署教程&#xff1a;conda环境复现与py310兼容性验证步骤 1. 开篇&#xff1a;为什么选择Janus-Pro-7B&#xff1f; 如果你正在寻找一个既能“看懂”图片&#xff0c;又能“画出”图片的AI模型&#xff0c;Janus-Pro-7B可能就是你要找的答案。这个模型最近在技术…...

嵌入式YouTube API客户端:ESP8266轻量级HTTPS REST封装库

1. 项目概述 YoutubeApi 是一个面向嵌入式平台的轻量级 YouTube Data API v3 封装库&#xff0c;专为资源受限的 Arduino 兼容开发板设计&#xff0c;当前已通过 ESP8266&#xff08;如 NodeMCU、Wemos D1 Mini&#xff09;完整验证&#xff0c;理论上兼容支持 TLS/SSL 的 Wi…...

3步搞定网页视频:猫抓工具的媒体资源高效获取方案

3步搞定网页视频&#xff1a;猫抓工具的媒体资源高效获取方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化内容爆炸的今天&#xff0c;网页视频已成为学习、娱乐和工作的重要信息载体。然…...

Qwen2-VL-2B-Instruct数据库课程设计:构建多模态内容管理平台

Qwen2-VL-2B-Instruct数据库课程设计&#xff1a;构建多模态内容管理平台 1. 引言&#xff1a;从图片堆到智能图库 想象一下&#xff0c;你正在为一个摄影工作室或者一个电商团队工作。每天&#xff0c;成百上千张图片被上传到服务器——产品图、活动照、设计素材。很快&…...

WuliArt Qwen-Image Turbo全流程解析:从输入Prompt到保存图片,一步步带你操作

WuliArt Qwen-Image Turbo全流程解析&#xff1a;从输入Prompt到保存图片&#xff0c;一步步带你操作 1. 项目简介与核心优势 WuliArt Qwen-Image Turbo是一款专为个人GPU设计的轻量级文本生成图像系统&#xff0c;基于阿里通义千问Qwen-Image-2512文生图底座&#xff0c;融合…...

动态调整模糊分割系数

【硕士论文复现SOC主动均衡】模糊控制基于自适应模糊协调器的双闭环Fuzzy-PI控制 复现电子科技大学硕士论文第三章 采用自适应模糊控制的双闭环Fuzzy-PI控制&#xff0c;控制效果非常好 可&#xff0c;可用于大小论文创新点&#xff0c;设计&#xff0c;方法非常有效电池管理系…...

rx 像素编辑器 Rust 实现原理:现代图形编程的最佳实践

rx 像素编辑器 Rust 实现原理&#xff1a;现代图形编程的最佳实践 【免费下载链接】rx &#x1f47e; Modern and minimalist pixel editor 项目地址: https://gitcode.com/gh_mirrors/rx/rx rx 是一个采用 Rust 语言实现的现代化极简像素编辑器&#xff0c;专为像素艺术…...

Kafka-Docker与OpenTelemetry集成:完整的分布式追踪方案指南

Kafka-Docker与OpenTelemetry集成&#xff1a;完整的分布式追踪方案指南 【免费下载链接】kafka-docker Dockerfile for Apache Kafka 项目地址: https://gitcode.com/gh_mirrors/ka/kafka-docker Apache Kafka作为现代微服务架构的核心消息队列系统&#xff0c;在生产环…...

知网/维普/万方三大平台AI检测全攻略:一文搞懂怎么通过

知网/维普/万方三大平台AI检测全攻略&#xff1a;一文搞懂怎么通过 前段时间帮学弟查了一篇论文&#xff0c;知网AI率38%&#xff0c;维普26%&#xff0c;万方19%。同一篇论文&#xff0c;三个数字差出一大截。他当时都懵了&#xff1a;“我到底该信哪个&#xff1f;” 答案很简…...

Win10环境下EMC VNX Unisphere图形界面Java配置全攻略

1. 为什么Win10访问EMC VNX Unisphere这么难&#xff1f; 每次打开浏览器准备登录EMC VNX存储的Unisphere管理界面时&#xff0c;是不是总能看到各种Java报错窗口跳出来&#xff1f;我见过不少工程师为了这个图形界面折腾一整天&#xff0c;最后只能无奈地装个XP虚拟机来应付。…...

Android USB OTG相机开发实战指南:从设备连接到高级应用

Android USB OTG相机开发实战指南&#xff1a;从设备连接到高级应用 【免费下载链接】Android-USB-OTG-Camera 项目地址: https://gitcode.com/gh_mirrors/an/Android-USB-OTG-Camera Android USB OTG相机项目是一个基于UVCCamera技术的开源解决方案&#xff0c;为Andr…...