当前位置: 移动技术网 > 移动技术>移动开发>Android > Android系统模拟位置的使用方法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文为大家分享了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软件编程有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网