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

  • 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"/>

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

  • 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;    }}

模拟位置

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();            }        }    }}

停止模拟位置

/** * 停止模拟位置,以免启用模拟数据后无法还原使用系统位置 * 若模拟位置未开启,则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模拟位置

更多相关文章

  1. 搭建 Android(安卓)X86 系统,替代AVD模拟器,解决运行效率慢的问题(
  2. android 悬浮窗教程
  3. 针对Android(安卓)模拟器启动慢的问题
  4. Android(安卓)studio4.0 解决导入包Error 报错问题
  5. selector选择器
  6. Android开发实战三之导入现有Android工程项目
  7. android背景选择器selector用法汇总
  8. 教你配置安卓开发环境!(附带开发通讯教程)
  9. Ubuntu 下用 Eclipse 编译调试 Android(安卓)NDK 工程

随机推荐

  1. frame动画
  2. Android之Gallery和ImageSwitcher结合的
  3. android――activity添加退出动画
  4. Android 显示当前服务的代码片段
  5. Android(安卓)Studio 提示错误 default a
  6. 设置里首选网络类型由3G改成4G
  7. Android 指南针程序
  8. android 关于localhost和访问本机服务的
  9. android 交叉编译工具的认识
  10. android日历和时间选择器 普通选择和dial