Android模拟地图gps定位

article/2025/10/12 1:12:59

目录

      • 1.判断权限
      • 2.开始定位(GPS位置)
      • 3.关闭位置
      • 4.实现效果

公司OA经常忘了打卡,想起来就到家了,这就很烦…
参考Android官方文档,学习使addTestProvider,setTestProviderLocation,实现简单指定经纬度GPS位置,要是忘了打卡,可不能用这个…
运行环境
设备:小米K30s
系统:Android12
状态:位置正常

1.判断权限

AndroidManifest.xml

 	<!--MOCK--><uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/><!--网络--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--GPS--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
object MockLocationUtils {/*** 是否选择应用* Android 6.0以下,通过Setting.Secure.ALLOW_MOCK_LOCATION判断* Android 6.0及以上,需要【开发者选项 选择应用】通过addTestProvider是否可用判断* @param context Context .* @return Boolean .*/@SuppressLint("WrongConstant")fun isAllowMockLocation(context: Context): Boolean {var canMockPosition = falseif (Build.VERSION.SDK_INT <= 22) { //6.0以下canMockPosition = Settings.Secure.getInt(context.contentResolver,Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0} else {try {val locationManager =context.getSystemService(Context.LOCATION_SERVICE) as LocationManagerval providerStr = LocationManager.GPS_PROVIDERval provider = locationManager.getProvider(providerStr)if (provider != null) {locationManager.addTestProvider(provider.name,provider.requiresNetwork(),provider.requiresSatellite(),provider.requiresCell(),provider.hasMonetaryCost(),provider.supportsAltitude(),provider.supportsSpeed(),provider.supportsBearing(),provider.powerRequirement,provider.accuracy)} else {locationManager.addTestProvider(providerStr,true,true,false,false,true,true,true,Criteria.POWER_HIGH,Criteria.ACCURACY_FINE)}locationManager.setTestProviderEnabled(providerStr, true)locationManager.setTestProviderStatus(providerStr,LocationProvider.AVAILABLE,null,System.currentTimeMillis())// 可用canMockPosition = truelocationManager.setTestProviderEnabled(providerStr, false)locationManager.removeTestProvider(providerStr)} catch (e: SecurityException) {canMockPosition = false}}return canMockPosition}
}

2.开始定位(GPS位置)

通过setTestProviderLocation(),设置GPS测试位置,实现模拟地图位置.注意位置的更新频率,不是设置一次就行.

/*** 开始位置*/@SuppressLint("MissingPermission")private fun startLocation() {val provider = mLocManager.getProvider(LocationManager.GPS_PROVIDER)if (provider != null) {mLocManager.addTestProvider(provider.getName(),provider.requiresNetwork(),provider.requiresSatellite(),provider.requiresCell(),provider.hasMonetaryCost(),provider.supportsAltitude(),provider.supportsSpeed(),provider.supportsBearing(),provider.getPowerRequirement(),provider.getAccuracy())} else {//Log.i(TAG, "startLocation: provider=null")Toast.makeText(this, "LocationProvider", Toast.LENGTH_LONG).show()return}/* 创建新的Location对象,并设定必要的属性值 */val location = Location(LocationManager.GPS_PROVIDER)location.latitude = CoordinateUtils.WGSLat(lat, lng)location.longitude = CoordinateUtils.WGSLon(lat, lng)location.accuracy = 500flocation.time = System.currentTimeMillis();location.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos();binding.btStart.tag = "end"try {// 开启测试ProvidermLocManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true)mLocManager.setTestProviderStatus(LocationManager.GPS_PROVIDER,LocationProvider.AVAILABLE,null,System.currentTimeMillis())mLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,10.0f,object : LocationListener {override fun onLocationChanged(location: Location) {Log.i(TAG,"onLocationChanged: lat:" + location.latitude + "lng:${location.longitude}")}})lifecycleScope.launch {while (binding.btStart.tag == "end") {delay(500)// 设置最新位置,一定要在requestLocationUpdate完成后进行,才能收到监听if (binding.btStart.tag == "end") {mLocManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, location);Log.i(TAG, "startLocation: " + System.currentTimeMillis())}}}binding.btStart.text = "关闭"binding.btStart.setBackgroundColor(Color.RED)binding.btStart.tag = "end"} catch (e: Exception) {Toast.makeText(this, "开启定位失败${e.message}", Toast.LENGTH_LONG).show()//binding.btStart.text = "开始"binding.btStart.setBackgroundColor(Color.parseColor("#FF6200EE"))binding.btStart.tag = "start"}}

3.关闭位置

removeTestProvider我自己的手机测试调用是正常的(Android11),在我同事Android10会crash(abstract method "void android.location.LocationListener.onProviderDisabled()).已经捕捉了文档上会出现的异常.不知道为啥. 只是移除会crash,可以正常使用位置…
官方APIhttps://developer.android.google.cn/reference/kotlin/android/location/LocationManager?hl=en#removetestprovider
在这里插入图片描述

 				try {mLocManager.removeTestProvider(LocationManager.GPS_PROVIDER)} catch (e1: IllegalArgumentException) {// 未成功addTestProvider时报错,为防万一有重复调用removeLog.i(TAG, "initView: ${e1.message}")} catch (e2: SecurityException) {Log.i(TAG, "initView: ${e2.message}")}

4.实现效果

调用正常,OA 获取的是这个模拟的位置,高德地图也是

在这里插入图片描述在这里插入图片描述


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

相关文章

怎样修改安卓位置服务器,修改安卓定位服务器地址

修改安卓定位服务器地址 内容精选 换一换 安卓模拟器(Android Virtual Device),简称AVD,可以模拟安卓设备并将其运行在服务器上。利用AVD,您可以对安卓应用进行原型设计、开发和测试,而无需使用真实的手机。AVD具备运行安卓应用、adb连接、上网、屏幕、GPS定位、电池、及VN…

安卓修改gps定位模拟百度地图移动

背景&#xff1a; 开发一个骑行app&#xff0c;页面是百度导航&#xff0c;演示需要模拟人骑行&#xff0c;位置不断移动。 位置模拟 核心是这个&#xff1a; for (String provider : mockProviders) {Location mockLocation null;if (location null) {mockLocation new…

第二十期 在Android中修改GPS定位数据的完整方案《手机就是开发板》

https://blog.csdn.net/aggresss/article/details/54323034 现在很多的应用都是基于位置服务的&#xff0c;而且把位置服务作为重要的参考标准&#xff0c;其实这是很不安全的&#xff0c;位置信息的数据未经过任何加密&#xff0c;而且是从我们的手机中发送出去的&#xff0c;…

Android-Framework-GPS定位原理和修改

一、 Android定位功能原理概述 1.1 Android三种定位提供方式。 Android 应用层获取定位可以通过三种定位提供方式&#xff1a;gps&#xff0c;network&#xff0c;passive。 gps –>&#xff08;GPS&#xff0c;AGPS&#xff09;&#xff1a; GPS位置提供者的名称。该提供商…

HDFS命令

用法 1.hadoop xxx hadoop fs命令可用于其他文件系统&#xff0c;不止是hdfs文件系统内也就是说该命令的使用范围更广&#xff0c;可以用于HDFS、Local FS等不同的文件系统 2.hdfs xxx hdfs dfs命令只用于hdfs文件系统 命令 1.用户命令 fsck&#xff1a;磁盘检查dfs&…

hadoop之hdfs命令

目录 1&#xff1a;创建目录 2、查看文件&#xff0c;ls 没有cd命令&#xff0c; 需要指定绝对路径 3&#xff1a;上传文件 put&#xff08;要先把数据上传到linux本地然后再上传&#xff09; 4&#xff1a;下载文件 get 5:复制 cp 6&#xff1a;查看文件内容 cat , 如果数…

hadoop(五)-hdfs命令行基本命令

HDFS是存取数据的分布式文件系统&#xff0c;那么对HDFS的操作&#xff0c;就是文件系统的基本操作&#xff0c;比如文件的创建、修改、删除、修改权限等&#xff0c;文件夹的创建、删除、重命名等。对HDFS的操作命令类似于Linux的shell对文件的操作&#xff0c;如ls、mkdir、r…

hadoop中上输入hdfs 相关命令显示无法找到问题

问题可能是没有在主目录配置你自己hadoop相关环境变量 解决方法&#xff1a; 1&#xff1a;切换到主目录&#xff0c;输入命令cd ~ 2:输入如下命令进入编辑&#xff1a; 3&#xff1a;在编辑页面最底部&#xff0c;输入如下命令&#xff1a; 4&#xff1a;退出保存编辑输入命令…

HDFS的命令操作

1&#xff09;基本语法 bin/hdfs dfs 具体命令 2) 常用命令实操 &#xff08;1&#xff09;-help&#xff1a;输出这个命令参数 bin/hdfs dfs -help rm &#xff08;2&#xff09;-ls: 显示目录信息 hdfs dfs -ls / &#xff08;3&#xff09;-mkdir&#xff1a;在hdfs上创…

【hadoop系列】Hadoop HDFS命令

格式&#xff1a;hadoop fs -命令 主要有如下的命令&#xff1a; 命令说明hadoop fs -mkdir创建HDFS目录hadoop fs -ls列出HDFS目录hadoop fs -copyFromLocal使用-copyFromLocal复制本地文件&#xff08;local&#xff09;到HDFShadoop fs -put使用-put复制本地&#xff08;lo…

【hadoop系列】Hadoop HDFS命令

格式&#xff1a;hadoop fs -命令 主要有如下的命令&#xff1a; 命令 说明 hadoop fs -mkdir 创建HDFS目录 hadoop fs -ls 列出HDFS目录 hadoop fs -copyFromLocal 使用-copyFromLocal复制本地文件&#xff08;local&#xff09;到HDFS hadoop fs -put 使用-put复制…

HDFS命令行操作

HDFS的命令行接口类似传统的Shell命令&#xff0c;可以通过命令行接口与HDFS系统进行交互&#xff0c;从而对系统中的文件进行读取、移动、创建操作。 命令行接口有两种格式如下&#xff1a; hadoop fs -命令 文件路径 hdfs dfs -命令 文件路径执行hadoop fs 或者 hdfs dfs可…

HDFS基础命令

通过vi在Linux本地创建三个文本文件&#xff1a;txt1.txt、txt2.txt、txt3.txt。文件里面随意输入些内容。 命令如下&#xff1a; vi txt1.txt vi txt2.txt vi txt3.txt (1)列出子目录或子文件 列出 HDFS 当前用户家目录下的文件及文件夹(前提&#xff1a;家目录已经存在&…

(超详细)HDFS常用命令及HDFS API基础编程

HDFS常用命令及基础编程 JunLeon——go big or go home 目录 HDFS常用命令及基础编程 一、HDFS概述 1、什么是HDFS&#xff1f; 2、HDFS数据存储模式——数据块&#xff08;block&#xff09; 3、HDFS的副本存放策略及机架感知 &#xff08;1&#xff09;副本存放策略&a…

HDFS常用命令汇总

HDFS常用命令汇总 一、前言信息二、帮助信息查看1、查看帮助信息2、帮助文档&#xff08;附带命令的详细说明&#xff09; 三、常用命令1、创建目录2、查看目录下的内容3、上传文件4、上传并删除源文件5、查看文件内容6、查看文件开头内容7、查看文件末尾内容8、下载文件9、合并…

大数据笔记 | HDFS 常用操作命令

目录 一、HDFS 命令前缀 二、ls 命令 三、put 命令 四、moveFromLocal 命令 五、get 命令 六、rm 命令 七、mkdir 命令 八、cp 命令 九、mv 命令 十、cat 命令 十一、appendToFile 命令 十二、总结 HDFS 是 Hadoop Distributed File System 的简写&#xff0c;即 H…

HTML encode Decode

System.Web.dll中&#xff0c;System.Web.HttpUtility.HtmlEncode(string s)方法的原理是这样的&#xff1a; 首先判断传入的字符串是否为null&#xff0c;如果是&#xff0c;则返回null if (s null ) ... { return null; } 然后&#xff0c;尝试在传入的字符…

html代码

hello 这是一个模拟黑客的玩意 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta charset"UTF-8"><li…

C# .net 几种HtmlEncode,HtmlDecode的区别

一、C#中的编码 HttpUtility.HtmlDecode、HttpUtility.HtmlEncode与Server.HtmlDecode、Server.HtmlEncode与HttpServerUtility.HtmlDecode、HttpServerUtility.HtmlEncode的区别&#xff1f; 它们与下面一般手工写的代码有什么区别&#xff1f; [c-sharp] view plaincopy pu…

【C#】C#中的HtmlEncode与HtmlDecode:HttpUtility.HtmlEncode,Server.HtmlEncode,WebUtility.HtmlEncode

HtmlEncode(String) 将字符串转换为 HTML 编码字符串。 HtmlDecode(String) 将已经为 HTTP 传输进行过 HTML 编码的字符串转换为已解码的字符串。 在web端项目中通常使用HttpUtility.HtmlEecode&#xff0c;HttpUtility.HtmlDecode&#xff0c;Server.HtmlEncode&#xff0c;Se…