Android10 mockLocation 模拟定位
网上搜了半天,试了很多方法,大同小异,当然报错也是大同小异……
最经典的报错就是 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 模拟定位相关推荐
- LifeCycle 的使用和原理
LifeCycle说明: 1.使用mockLocation,此LifeActivity是ComponentActivity的子类,所以也是LifeCycleOwner的实现类 2.Mo ...
- android studio 使用Mocklocation虚拟定位总结
首先需要在 AndroidManifest.xml 文件中添加「获取模拟定位信息」权限. <uses-permission android:name="android.permissi ...
- 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
源码开发编译中,熟练掌握常用命令,可以提高开发工作效率.Android源码中,将相关的命令分为如下几类: 1.初始化源码编译环境 初始化编译环境,为后续提供如lunch.make.xxgrep.god ...
- 编译系统总结篇-Android10.0编译系统(十一)
摘要:Android10.0编译系统总结 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关 ...
- Ninja提升编译速度的方法-Android10.0编译系统(十)
摘要:如何通过Ninja来提升Android编译速度 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢 ...
- Ninja简介-Android10.0编译系统(九)
摘要:Ninja具体干了什么? 阅读本文大约需要花费16分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关注我的公众 ...
- Android.bp 语法浅析-Android10.0编译系统(八)
摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...
- Blueprint代码详细分析-Android10.0编译系统(七)
摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...
- Blueprint简介-Android10.0编译系统(六)
摘要:Android.bp由Blueprint进行解析翻译,最终通过soong build编译成ninja文件,那么Blueprint是什么呢? 阅读本文大约需要花费10分钟. 文章首发微信公众号:I ...
- Kati详解-Android10.0编译系统(五)
摘要:本节主要来讲解Kati把Makefile编译成build-xxx.ninja,那么Kati是什么? 是如何工作的呢? 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于 ...
最新文章
- Java 用float时,数字后面加f,这样是为什么?
- 阿里员工都在用的知识管理工具,究竟有何特别?
- 前端学习(751):Javascript作用域
- C语言定义外部变量或函数使得另一个C文件可以调用
- 基础编程题目集 6-1 简单输出整数 (10 分)
- 点阵字体显示系列之一:ASCII码字库的显示
- javascript 变换变量 数据类型 类型转换 运算符 运算表达式 运算优先级 理解笔记...
- 未来,语音识别可能应用于哪些商业化场景?
- java发送短信的发送报告处理
- 《剑指offer》面试题24——二叉搜索树的后序遍历序列(C++)
- 功能测试怎么做?常用功能测试方法总结
- 苹果手机HTML页面滑动卡顿
- RemoveWGA升级了
- c语言 称重系统设计,智能称重系统设计-文献综述.doc
- 立体感css播放按钮样式
- JSP使用EL表达式实现if,else
- 华为联合全球伙伴加速上线HMS内容类应用,影音娱乐体验一步尝鲜
- KKT(Karush-Kuhn-Tucher)条件
- 史上最全讲解:Spring详解
- 路由器测试的类型和方法[转]