Android系统模拟位置的使用方法

本文为大家分享了Android模拟位置的使用方法,支持Android6.0,供大家参考,具体内容如下

1、开启系统设置中的模拟位置

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

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

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

2、判断是否开启了系统模拟位置

Android 6.0 以下:使用Settings.Secure.ALLOW_MOCK_LOCATION判断。

// Android 6.0 以下:是否开启【允许模拟位置】
boolean canMockPosition = Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0

Android 6.0 及以上:没有【允许模拟位置】选项,同时弃用了Settings.Secure.ALLOW_MOCK_LOCATION,无法通过上面的方法判断。增加了【选择模拟位置信息应用】的方法,需要选择使用模拟位置的应用。但是不知道怎么获取当前选择的应用,因此通过是否能够成功执行addTestProvider方法来进行判断,如果没有选择当前的应用,则addTestProvider会抛出异常。

boolean hasAddTestProvider = false; boolean canMockPosition = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0) || Build.VERSION.SDK_INT > 22; if (canMockPosition && hasAddTestProvider == false) { try { String providerStr = LocationManager.GPS_PROVIDER; 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 { 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()); // 模拟位置可用 hasAddTestProvider = true; canMockPosition = true; } catch (SecurityException e) { canMockPosition = false; } }

3、模拟位置

private class RunnableMockLocation implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(INTERVEL); if (hasAddTestProvider() == false) { continue; } try { // 模拟位置(addTestProvider成功的前提下) String providerStr = LocationManager.GPS_PROVIDER; Location mockLocation = new Location(providerStr); mockLocation.setLatitude(22); // 维度(度) mockLocation.setLongitude(113); // 经度(度) mockLocation.setAltitude(30); // 高程(米) mockLocation.setBearing(180); // 方向(度) mockLocation.setSpeed(10); //速度(米/秒) 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); } catch (Exception e) { // 防止用户在软件运行过程中关闭模拟位置或选择其他应用 stopMockLocation(); } } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } }

4、停止模拟位置

/** * 停止模拟位置,以免启用模拟数据后无法还原使用系统位置 * 若模拟位置未开启,则removeTestProvider将会抛出异常; * 若已addTestProvider后,关闭模拟位置,未removeTestProvider将导致系统GPS无数据更新; */ public void stopMockLocation() { if (hasAddTestProvider) { try { locationManager.removeTestProvider(LocationManager.GPS_PROVIDER); } catch (Exception ex) { // 若未成功addTestProvider,或者系统模拟位置已关闭则必然会出错 } hasAddTestProvider = false; } }

Android Studio Project

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

时间: 2024-09-25 00:26:31

Android系统模拟位置的使用方法的相关文章

Android系统模拟位置的使用方法_Android

本文为大家分享了Android模拟位置的使用方法,支持Android6.0,供大家参考,具体内容如下 1.开启系统设置中的模拟位置 Android 6.0 以下:[开发者选项 -> 允许模拟位置] Android 6.0 及以上:[开发者选项 -> 选择模拟位置信息应用] AndroidManifest.xml <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> &

Android listview定位到上次显示的位置的实现方法

Android listview定位到上次显示的位置的实现方法 整体思路:滑动lictview时,记录listview的位置,定位时定位到该位置. 1.添加全局变量 private int scrolledX = 0; private int scrolledY = 0; 2.Oncreate()添加滚动事件监听 ClassesLV.setOnScrollListener(new OnScrollListener() { /** * 滚动状态改变时调用 */ @Override public v

android实现listview分页的方法

  本文实例讲述了android实现listview分页的方法.分享给大家供大家参考.具体分析如下: 最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset关键字,前者是查询每页展示的记录数,后者是越过多少记录数,说得明白点就是忽略前面多少行记录之后,取多少行记录 我分页采用了一个重要的类Page,通过封装Page类,做为参数传递进来,返回出去也是个Page对象 ? 1 2 3 4 5 6

Android开发改变字体颜色方法_Android

在TextView中添加文本时有时会改变一些文本字体的颜色,今天主要分享三种实现方法及相关优缺点. 1.通过html标签改变文本颜色 复制代码 代码如下: tv.setText(Html.fromHtml("我是<font color=blue>danyijiangnan</font>")); 点评:通过Html.fromHtml()方法就可以在字符串中使用html的标签,通过font标签可以改变字体的格式.麦子学院-国内最专业的IT在线教育平台. 2.在act

Android View移动的六种方法小结_Android

在android开发中,经常会遇到一个view需要它能够支持滑动的需求.下面通过本篇文章给大家介绍android view移动的六种方法. layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView extends View{ private int lastX; private int lastY; public DragView(Context cont

详解Android中Intent的使用方法_Android

一.Intent的用途 Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivity()方法或startActivityForResult()方法以启动一个Activity,该Intent对象包含了要启动的Activity的信息及其他必要的数据. 2. 启动Service:可以将Intent对象传递给startService()方法或bindService()方法以启动一个Service,该Intent对象包含了要启动的Service的

android新闻客户端 页面 翻滚 方法的理解

问题描述 android新闻客户端 页面 翻滚 方法的理解 scrollTo(1 1) 里面的 1 ,1表示什么意思呢? 右侧可以实现向下翻滚的效果 解决方案 这个要看它怎么定义的,不是系统类库.应该是表示位置的参数

getview方法不执行- android listview自定义adapter,getview方法不显示

问题描述 android listview自定义adapter,getview方法不显示 adapter的getCount值不为0,但是不执行getview方法,在ErrorLog中打印出来的log在下面贴出来了,希望路过的大牛们帮忙看看 解决方案 问题找到了,是我的listView的布局控件不正确,已经改好了 解决方案二: android listView 重写Adapter方法getView的性能优化问题 解决方案三: 空指针异常,找找在哪个位置. 解决方案四: log和问的错没什么关系 解

Android中TelephonyManager类的方法实例分析_Android

本文实例讲述了Android中TelephonyManager类的方法.分享给大家供大家参考.具体如下: TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取相关数据. TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是有些通讯