栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

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

AndroidManifest.xml



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、停止模拟位置


public void stopMockLocation() {
  if (hasAddTestProvider) {
    try {
      locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
      // 若未成功addTestProvider,或者系统模拟位置已关闭则必然会出错
    }
    hasAddTestProvider = false;
  }
}

Android Studio Project

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/162581.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号