源码下载地址:https://download.csdn.net/download/sheziqiong/85628133

Android 实现模拟地图定位功能

实现原理:

  手机定位方式目前有4种:基站定位,WIFI定位,GPS定位,AGPS定位。

  本工程利用手机自带的"模拟位置"功能实现运行时修改LocationManager结果。
  原理:使用android自带的调试api,模拟gps provider的结果。

  Android 6.0系统以下,可以通过Setting.Secure.ALLOW_MOCK_LOCATION获取是否【允许模拟位置】,当【允许模拟位置】开启时,可addTestProvider;

  Android 6.0系统及以上,弃用Setting.Secure.ALLOW_MOCK_LOCATION变量,没有【允许模拟位置】选项,
增加【选择模拟位置信息应用】,此时需要选择当前应用,才可以addTestProvider,
但未找到获取当前选择应用的方法,因此通过addTestProvider是否成功来判断是否可用模拟位置。

代码分析:

MockLocationManager:模拟地址管理类
  首先通过Android系统模拟位置管理器LocationManager获取系统模拟位置服务,Android 6.0以下,通过Setting.Secure.ALLOW_MOCK_LOCATION判断是否可模拟位置,Android 6.0及以上,需要【选择模拟位置信息应用】,未找到方法,因此通过addTestProvider是否可用判断。

    /*** 模拟位置是否启用* 若启用,则addTestProvider*/public boolean getUseMockPosition(Context context) {// Android 6.0以下,通过Setting.Secure.ALLOW_MOCK_LOCATION判断// Android 6.0及以上,需要【选择模拟位置信息应用】,未找到方法,因此通过addTestProvider是否可用判断boolean canMockPosition = (Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0)|| Build.VERSION.SDK_INT > 22;if (canMockPosition && hasAddTestProvider == false) {try {for (String providerStr : mockProviders) {LocationProvider provider = locationManager.getProvider(providerStr);if (provider != null) {locationManager.addTestProvider(provider.getName(), provider.requiresNetwork(), provider.requiresSatellite(), provider.requiresCell(), provider.hasMonetaryCost(), provider.supportsAltitude(), provider.supportsSpeed(), provider.supportsBearing(), provider.getPowerRequirement(), provider.getAccuracy());} else {if (providerStr.equals(LocationManager.GPS_PROVIDER)) {locationManager.addTestProvider(providerStr, true, true, false, false, true, true, true, Criteria.POWER_HIGH, Criteria.ACCURACY_FINE);} else if (providerStr.equals(LocationManager.NETWORK_PROVIDER)) {locationManager.addTestProvider(providerStr, true, false, true, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);} else {locationManager.addTestProvider(providerStr, false, false, false, false, true, true, true, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);}}locationManager.setTestProviderEnabled(providerStr, true);locationManager.setTestProviderStatus(providerStr, LocationProvider.AVAILABLE, null, System.currentTimeMillis());}hasAddTestProvider = true;  // 模拟位置可用canMockPosition = true;} catch (SecurityException e) {canMockPosition = false;}}if (canMockPosition == false) {stopMockLocation();}return canMockPosition;}
```http://www.biyezuopin.vip
  接下来设置模拟经纬度数据:
```java// 模拟位置(addTestProvider成功的前提下)for (String providerStr : mockProviders) {Location mockLocation = new Location(providerStr);mockLocation.setLatitude(latitude);   // 维度(度)mockLocation.setLongitude(longitude);  // 经度(度)mockLocation.setAccuracy(0.1f);   // 精度(米)mockLocation.setTime(new Date().getTime());   // 本地时间if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());}locationManager.setTestProviderLocation(providerStr, mockLocation);}
```http://www.biyezuopin.vip
  取消模拟定位方法:
```java/*** 取消位置模拟,以免启用模拟数据后无法还原使用系统位置* 若模拟位置未开启,则removeTestProvider将会抛出异常;* 若已addTestProvider后,关闭模拟位置,未removeTestProvider将导致系统GPS无数据更新;*/public void stopMockLocation() {if (hasAddTestProvider) {for (String provider : mockProviders) {try {locationManager.removeTestProvider(provider);} catch (Exception ex) {// 此处不需要输出日志,若未成功addTestProvider,则必然会出错// 这里是对于非正常情况的预防措施}}hasAddTestProvider = false;}}

  注册位置服务,获取系统位置

        // 注册位置服务,获取系统位置if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}mockLocationManager.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

  最后通过LocationListener.onLocationChanged()回调方法获取GPS定位数据:

 private LocationListener locationListener = new LocationListener() {@Overridepublic void onLocationChanged(final Location location) {setLocationData(location);}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}};/*** 获取到模拟定位信息,并显示** @param location 定位信息*/private void setLocationData(Location location) {tvProvider.setText(location.getProvider());tvTime.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(location.getTime())));tvLatitude.setText(location.getLatitude() + " °");tvLongitude.setText(location.getLongitude() + " °");}

使用模拟定位需先开启系统设置中的模拟位置:

  • Android 6.0 以下:【开发者选项 -> 允许模拟位置】

  • Android 6.0 及以上:【开发者选项 -> 选择模拟位置信息应用】

参考链接:

  • 1、【科普】GPS、Wifi等各种手机定位方式的含义及原理详解
  • 2、Android 使用模拟位置(支持Android 6.0)
  • 3、http://www.biyezuopin.vip

源码下载地址:https://download.csdn.net/download/sheziqiong/85628133

基于安卓实现的模拟定位功能(Android)相关推荐

  1. 基于安卓的企业物流管理系统(Android客户端+JavaSSM服务端开发的物流管理APP)

    摘 要 随着互联网的技术的快速发展和无线网络的更新迭代,使4G网络已成为过去式5G网络蓬勃发展.技术的发展,硬件的提高使人们使用智能手机可以更加快速.便捷的浏览信息.获取信息. 本文首先介绍企业物流管 ...

  2. 基于安卓的网上药店管理系统android

    本次设计运用android平台手机作为研究开发对象,配合Java语言程序设计以及面向对象思想设计了一种网上药品在线销售系统.本设计完成后,能够实现以下功能:手机端用户可以进行注册与登录.用户信息管理. ...

  3. 毕设--(AS)基于安卓的多功能日记本

    毕设–(AS)基于安卓的多功能日记本 前言 这是一个基于安卓系统的多功能日记本APP,包含日记和记账本两种大的功能.此为毕设项目,开发过程经多方借鉴最终完成. 效果图 这里选取一些效果图进行展示 开发 ...

  4. android的aod的功能,一加正式推出氢OS 11:基于安卓11打造 新增「年轮AOD」功能

    原标题:一加正式推出氢OS 11:基于安卓11打造 新增「年轮AOD」功能 飞象网讯(高靖宇/文)8月10日下午消息,一加手机今天下午举行线上氢听会,正式发布氢 OS 11系统,基于Android 1 ...

  5. android餐厅菜单功能,基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)...

    基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)(毕业论文18000字,程序代码,SQLite数据库) 本课题是基于android(安卓)平台开发的,作为餐饮业点餐使用的一个工具 ...

  6. flyme最新7基于android,魅族flyme6基于安卓android7.0吗?魅族flyme6.0有什么功能?[图]...

    魅族flyme6你更新了吗?很多朋友已经在使用了!不少朋友还在观望!还有疑问,魅族flyme6基于安卓android7.0吗?魅族flyme6.0有什么功能?先来了解清楚吧! 魅族flyme6基于安卓 ...

  7. 基于android的记账本论文,(毕业论文)基于安卓的记账本.doc

    目录 1.概述3 1.1 设计目标3 1.2 开发工具3 2 需求分析4 2.1系统功能:4 2.2系统功能描述:4 2.3系统用例图:5 2.4运行环境需求5 3 系统设计6 3.1基本设计概念和处 ...

  8. java创建医生的对象_基于安卓Android的作物医生App设计开发(MySQL)(含录像)

    基于安卓Android的作物医生App设计开发(MySQL)(含录像)(毕业论文14000字,PHP程序代码,MySQL数据库) 本系统使用软件工程方法进行一系列的分析.设计.实现与测试.使用面向对象 ...

  9. java计算机毕业设计基于安卓Android/微信小程序的大学生签到管理系统APP

    项目介绍 随着Internet的发展,人们的日常生活已经离不开网络.未来人们的生活与工作将变得越来越数字化,网络化和电子化.网上管理,它将是直接管理签到系统app的最新形式.本论文是以构建签到系统ap ...

  10. miui 10 android 9.0,小米基于安卓9.0的MIUI10稳定版来了,你的手机可以更新吗?

    原标题:小米基于安卓9.0的MIUI10稳定版来了,你的手机可以更新吗? 谷歌今年率先发布了安卓9.0系统之后,很多的手机厂商也开始争抢着进行适配更新,但是能够推出稳定版的其实还是没有见到,大部分都处 ...

最新文章

  1. java类加载是什么意思_java 类加载机制有什么用
  2. 漫画 | 程序员必须要小心的 7 个潜规则
  3. DSP编程技巧---C/C++与汇编语言的交互之-使用编译器的内联函数
  4. error C2057: expected constant expression (C语言中数组的大小可以在程序运行时定义吗? )
  5. 一般市区有测速吗_高速公路增加这么多龙门架,有抓拍超速违章功能吗?可要仔细辨别...
  6. Qt4 QRadioButton和QCheckBox用法示例
  7. Flutter: MobX和flutter_mobx状态管理器
  8. 剑指offer例题分享--7
  9. UEditor手动调节其宽度
  10. 贪心算法(java实现)
  11. 计算机网络(王道考研笔记)
  12. 【控制】PID和LQR
  13. 方框加对勾怎么输入_对号“√”怎么输入到方框“□”-空格对号
  14. 自然语言处理中的迁移学习(上)
  15. 解决笔记本电脑连的上WIFI但上不了网问题
  16. STM32笔记-FM收音机
  17. 苹果手机怎么扩大内存_怎样扩大手机内存
  18. Redis启动、停止、查看
  19. 政策解读 | 杜绝“大数据杀熟” 《个人信息保护法》来了
  20. nacivate premium 12.1.12 安装包加破解注册机 亲测可用

热门文章

  1. 文本处理及正则表达式
  2. java-房屋出租系统(项目)
  3. elastic-job和xxl-job实践对比
  4. 树莓派微型计算机教程,简单易用的树莓派平板 带你快速入门计算机编程
  5. 《21天学通C语言(第7版)》一6.6 课后研习
  6. 利用MATLAB进行二次曲线方程的正交变换化简
  7. Python——jieba优秀的中文分词库(基础知识+实例)
  8. IDEA / webstorm 破解
  9. Datalogic得利捷Memor™ 10入选“安卓企业推荐计划”
  10. python离线录音转文字软件_有能把录音变成文字的软件么?