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软件编程有所帮助。

(0)

相关推荐

  • Android编程获取地理位置的经度和纬度实例

    本文实例讲述了Android编程获取地理位置的经度和纬度.分享给大家供大家参考,具体如下: 在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息.看如下实例:新建android应用程序TestLocation. 1.activity_main.xml布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

  • android通过gps获取定位的位置数据和gps经纬度

    复制代码 代码如下: package com.action.android_test;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.

  • Android开发之Location用法实例分析

    本文实例讲述了Android开发中Location用法.分享给大家供大家参考,具体如下: Location 在Android 开发中还是经常用到的,如通过经纬度获取天气,根据Location 获取所在地区详细Address (比如Google Map 开发)等.而在Android 中通过LocationManager来获取Location .通常获取Location 有GPS 获取,WIFI 获取. 这边介绍一个简单的小Demo ,来教大家如何获取Location ,从而获取经纬度. 第一步:创

  • Android使用GPS获取用户地理位置并监听位置变化的方法

    本文实例讲述了Android使用GPS获取用户地理位置并监听位置变化的方法.分享给大家供大家参考,具体如下: LocationActivity.java /* LocationActivity.java * @author octobershiner * 2011 7 22 * SE.HIT * 一个演示定位用户的位置并且监听位置变化的代码 * */ package uni.location; import android.app.Activity; import android.content

  • 浅析Android手机卫士之手机实现短信指令获取位置

    推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 浅析Android手机卫士接收短信指令执行相应操作 浅析Android手机卫士手机定位的原理 获取位置 新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreat

  • Android百度定位导航之基于百度地图移动获取位置和自动定位

    一.问题描述 使用百度地图实现如图所示应用,首先自动定位当前我起始位置(小圆点位置),并跟随移动不断自动定位我的当前位置 百度Api不同版本使用会有些差异,本例中加入lib如下: 二.编写MyApplication类 public class MyApplication extends Application { static MyApplication myApplication; BMapManager mBMapManager = null; String mStrKey = "7ZfuR

  • android通过Location API显示地址信息的实现方法

    本文实例讲述了android通过Location API显示地址信息的实现方法.分享给大家供大家参考.具体如下: android的Locatin API,可以通过Geocoder类,显示具体经纬度的地址信息.如: 通过Geocoder的方法getFromLocation()可以得到Address对象的List.我只取一个Address结果,可以取多个,但是意义不大. StringBuilder builder = new StringBuilder(); builder.append("北纬:&

  • Android打开GPS导航并获取位置信息返回null解决方案

    最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 复制代码 代码如下: getLastKnownLocation(LocationManager.GPS_PROVIDER), 于是高兴地不得了.可是一写进代码里,返回值(Location 类型)居然一直为null..郁闷的不得了.在网上查了好久,发现好多人都和我一样纠结于这个问题上,有人说是因为GPS没打开,也有人说是相关权限没加上..可是我的明明已经在设置里打开,权限

  • Android获取当前位置的经纬度数据

    现在有这么一个需求:开启一个Service服务,获取当前位置的经纬度数据,将获取的数据以广播的方式发送出去,注册广播的Activity接收广播信息,并将接收到的数据在当前Activity显示,如果当前位置发生变化,经纬度数据改变,获取改变后的经纬度数据,通过Handler发送消息,更新UI界面,显示更新后的内容,请问这样子的Demo该如何实现? LocationTool获取当前位置信息 Android手机获取当前位置的方式:GPS定位,WIFI定位,基站定位,当前Demo使用GPS卫星定位,在L

  • 用Android Location获取当前地理位置的方法

    在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子. 复制代码 代码如下: public Location getLocation() {// 获取Location通过LocationManger获取!  LocationManager locManger = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  Location loc = locMange

  • Android使用criteria选择合适的地理位置服务实现方法

    本文实例讲述了Android使用criteria选择合适的地理位置服务实现方法.分享给大家供大家参考,具体如下: /* LocationActivity.java * @author octobershiner * 2011 7 24 * SE.HIT * 利用Criteria选择最优的位置服务,演示定位用户的位置并且监听位置变化的代码 * */ package uni.location; import android.app.Activity; import android.content.C

  • Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical&q

随机推荐