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

 更新时间:2016年05月13日 10:38:37   作者:doris_d  
这篇文章主要为大家详细介绍了Android系统模拟位置的使用方法,具有参考价值,感兴趣的小伙伴们可以参考一下

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

相关文章

  • 分析Android常见的内存泄露和解决方案

    分析Android常见的内存泄露和解决方案

    内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃 (OOM) 等严重后果
    2021-06-06
  • Android自定义控件单位尺寸实现代码

    Android自定义控件单位尺寸实现代码

    这篇文章主要介绍了Android自定义控件单位尺寸实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 在Android线程池里运行代码任务实例

    在Android线程池里运行代码任务实例

    这篇文章主要介绍了在Android线程池里运行代码任务实例,同时介绍了线程池中停止任务的方法,需要的朋友可以参考下
    2014-06-06
  • Android studio实现菜单操作

    Android studio实现菜单操作

    这篇文章主要为大家详细介绍了Android studio实现菜单操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Flutter禁止手机横屏的简单实现方法

    Flutter禁止手机横屏的简单实现方法

    app默认是可以横屏的,如果需要禁止横屏话可以参考这篇文章,本文主要给大家介绍了关于Flutter禁止手机横屏的简单实现方法,需要的朋友可以参考下
    2021-07-07
  • Android实现画中画功能(图片)

    Android实现画中画功能(图片)

    画中画是一种特殊类型的多窗口模式,最常用于视频播放。这篇文章主要介绍了Android实现画中画功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Android 更新UI的方法汇总

    Android 更新UI的方法汇总

    这篇文章主要介绍了Android 更新UI的方法汇总的相关资料, 非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Android开发实例之多点触控程序

    Android开发实例之多点触控程序

    本文主要介绍 Android开发多点触控,这里提供了详细的资料和示例代码,以及实现效果图,有开发Android应用需要这样的功能的小伙伴可以参考下
    2016-08-08
  • android 设置圆角图片实现代码

    android 设置圆角图片实现代码

    在android应用开发中,可能是美化需要,图片需要处理成圆角,本文将给出实现代码,开发中的遇到此问题的朋友可以参考下
    2012-11-11
  • Android集成Unity的两种方案

    Android集成Unity的两种方案

    现在市面上的形形色色Android客户端,为了更优的用户体验,我们开发的上游产品和交互往往会在界面里设计很多动效,传统的一页页的静态展示页面已经不足以满足用户的审美需求了,本文将给大家分享Android集成Unity的两种方案,感兴趣的朋友可以参考下
    2024-05-05

最新评论