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

2019-12-10 18:02:56于丽

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