欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-31 15:57:22
本文为大家分享了android模拟位置的使用方法,支持android6.0,供大家参考,具体内容如下 1、开启系统设置中的模拟位置 android 6.0 以下:【开发...

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

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

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

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

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

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

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系统模拟位置的使用方法

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

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