网上搜了半天,试了很多方法,大同小异,当然报错也是大同小异……

最经典的报错就是 IllegalArgumentException: Provider "gps" already exists

这里介绍一下如何解决这个问题,并且给出正确的模拟定位方法。

首先当然是先在AndroidManifest里申请权限了

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"tools:ignore="MockLocation,ProtectedPermissions"/>

在Android 10里定位是危险权限,如果不是在编译系统的时候打包的apk,就需要动态申请权限:

private void initPermissions(Context context) {RequestPermissions(context, "android.permission.ACCESS_FINE_LOCATION");RequestPermissions(context, "android.permission.ACCESS_COARSE_LOCATION");RequestPermissions(context,"android.permission.ACCESS_MOCK_LOCATION");}public static boolean RequestPermissions(Context context, String permission) {if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {Log.i("requestMyPermissions", ": 【 " + permission + " 】没有授权,申请权限");ActivityCompat.requestPermissions((Activity) context, new String[]{permission}, 100);return false;} else {Log.i("requestMyPermissions", ": 【 " + permission + " 】有权限");return true;}}

然后就是获取LocationManager、构建location 注意location参数必须设满,否则会报不完整错误:

java.lang.IllegalArgumentException: Incomplete location object

mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);Location mockLocation = new Location(GPS_PROVIDER);mockLocation.setLatitude(116.397128);mockLocation.setLongitude(39.916527);mockLocation.setAltitude(0);mockLocation.setTime(System.currentTimeMillis());mockLocation.setSpeed(0.01f);mockLocation.setBearing(1f);mockLocation.setAccuracy(3f);mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mockLocation.setBearingAccuracyDegrees(0.1f);mockLocation.setVerticalAccuracyMeters(0.1f);mockLocation.setSpeedAccuracyMetersPerSecond(0.01f);}

下一步就是直接mock location了:

这里需要在addTestProvider之前remove一次,否则会报 Provider "gps" already exists 。

源码:frameworks/base/services/core/java/com/android/server/LocationManagerService.java

    @Overridepublic void addTestProvider(String name, ProviderProperties properties, String opPackageName) {if (!canCallerAccessMockLocation(opPackageName)) {return;}if (PASSIVE_PROVIDER.equals(name)) {throw new IllegalArgumentException("Cannot mock the passive location provider");}synchronized (mLock) {long identity = Binder.clearCallingIdentity();try {LocationProvider oldProvider = getLocationProviderLocked(name);if (oldProvider != null) {if (oldProvider.isMock()) {throw new IllegalArgumentException("Provider \"" + name + "\" already exists");}removeProviderLocked(oldProvider);}

mock代码:

public void mockGps(Location location) throws SecurityException {location.setProvider(GPS_PROVIDER);try{// @throws IllegalArgumentException if a provider with the given name already existsmLocationManager.addTestProvider(GPS_PROVIDER, false, false, false, false, false, true, true, 0, 5);}  catch (IllegalArgumentException ignored){}try{// @throws IllegalArgumentException if no provider with the given name existsmLocationManager.setTestProviderEnabled(GPS_PROVIDER, true);} catch (IllegalArgumentException ignored){mLocationManager.addTestProvider(GPS_PROVIDER, false, false, false, false, false, true, true, 0, 5);}try{// @throws IllegalArgumentException if no provider with the given name existsmLocationManager.setTestProviderLocation(GPS_PROVIDER, location);} catch (IllegalArgumentException ignored){// IllegalArgumentException: Provider "gps" already existsmLocationManager.removeTestProvider(GPS_PROVIDER);mLocationManager.addTestProvider(GPS_PROVIDER, false, false, false, false, false, true, true, 0, 5);mLocationManager.setTestProviderEnabled(GPS_PROVIDER, true);mLocationManager.setTestProviderLocation(GPS_PROVIDER, location);}}

如此一来就模拟成功了,当然安装apk成功后,记得在开发者模式里设置 “选择模拟位置信息位置 ”为当前app。

Android10 mockLocation 模拟定位相关推荐

  1. LifeCycle 的使用和原理

    LifeCycle说明:     1.使用mockLocation,此LifeActivity是ComponentActivity的子类,所以也是LifeCycleOwner的实现类     2.Mo ...

  2. android studio 使用Mocklocation虚拟定位总结

    首先需要在 AndroidManifest.xml 文件中添加「获取模拟定位信息」权限. <uses-permission android:name="android.permissi ...

  3. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令

    源码开发编译中,熟练掌握常用命令,可以提高开发工作效率.Android源码中,将相关的命令分为如下几类: 1.初始化源码编译环境 初始化编译环境,为后续提供如lunch.make.xxgrep.god ...

  4. 编译系统总结篇-Android10.0编译系统(十一)

    摘要:Android10.0编译系统总结 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关 ...

  5. Ninja提升编译速度的方法-Android10.0编译系统(十)

    摘要:如何通过Ninja来提升Android编译速度 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢 ...

  6. Ninja简介-Android10.0编译系统(九)

    摘要:Ninja具体干了什么? 阅读本文大约需要花费16分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关注我的公众 ...

  7. Android.bp 语法浅析-Android10.0编译系统(八)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  8. Blueprint代码详细分析-Android10.0编译系统(七)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  9. Blueprint简介-Android10.0编译系统(六)

    摘要:Android.bp由Blueprint进行解析翻译,最终通过soong build编译成ninja文件,那么Blueprint是什么呢? 阅读本文大约需要花费10分钟. 文章首发微信公众号:I ...

  10. Kati详解-Android10.0编译系统(五)

    摘要:本节主要来讲解Kati把Makefile编译成build-xxx.ninja,那么Kati是什么? 是如何工作的呢? 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于 ...

最新文章

  1. Java 用float时,数字后面加f,这样是为什么?
  2. 阿里员工都在用的知识管理工具,究竟有何特别?
  3. 前端学习(751):Javascript作用域
  4. C语言定义外部变量或函数使得另一个C文件可以调用
  5. 基础编程题目集 6-1 简单输出整数 (10 分)
  6. 点阵字体显示系列之一:ASCII码字库的显示
  7. javascript 变换变量 数据类型 类型转换 运算符 运算表达式 运算优先级 理解笔记...
  8. 未来,语音识别可能应用于哪些商业化场景?
  9. java发送短信的发送报告处理
  10. 《剑指offer》面试题24——二叉搜索树的后序遍历序列(C++)
  11. 功能测试怎么做?常用功能测试方法总结
  12. 苹果手机HTML页面滑动卡顿
  13. RemoveWGA升级了
  14. c语言 称重系统设计,智能称重系统设计-文献综述.doc
  15. 立体感css播放按钮样式
  16. JSP使用EL表达式实现if,else
  17. 华为联合全球伙伴加速上线HMS内容类应用,影音娱乐体验一步尝鲜
  18. KKT(Karush-Kuhn-Tucher)条件
  19. 史上最全讲解:Spring详解
  20. 路由器测试的类型和方法[转]

热门文章

  1. 如何批量PDF转换JPG
  2. python复制上一条语句快捷键_pycharm快捷键及一些常用设置
  3. 数据库系统的三大范式以及BCNF范式详细讲解 (很详细,很详细,很详细)
  4. Thinkpadt450 win7下面禁用触摸板
  5. linux下word转pdf
  6. [Groovy]Groovy with Ant Task
  7. C/C++编程学习 - 第16周 ④ 计算分数加减表达式的值
  8. 怎么把图片转换成表格?这三种办法值得收藏
  9. 算加权成绩(MATLAB)
  10. 烦哪烦哪烦哪没有力气..