Android系统模拟位置的使用方法_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系统模拟器、android 系统图标位置、华为系统不能模拟位置、android 模拟位置、android模拟位置软件,以便于您获取更多的相关知识。

时间: 2024-10-04 07:55:44

Android系统模拟位置的使用方法_Android的相关文章

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

本文为大家分享了Android模拟位置的使用方法,支持Android6.0,供大家参考,具体内容如下 1.开启系统设置中的模拟位置 Android 6.0 以下:[开发者选项 -> 允许模拟位置] Android 6.0 及以上:[开发者选项 -> 选择模拟位置信息应用] AndroidManifest.xml <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> &

Android开发改变字体颜色方法_Android

在TextView中添加文本时有时会改变一些文本字体的颜色,今天主要分享三种实现方法及相关优缺点. 1.通过html标签改变文本颜色 复制代码 代码如下: tv.setText(Html.fromHtml("我是<font color=blue>danyijiangnan</font>")); 点评:通过Html.fromHtml()方法就可以在字符串中使用html的标签,通过font标签可以改变字体的格式.麦子学院-国内最专业的IT在线教育平台. 2.在act

详解Android中Intent的使用方法_Android

一.Intent的用途 Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivity()方法或startActivityForResult()方法以启动一个Activity,该Intent对象包含了要启动的Activity的信息及其他必要的数据. 2. 启动Service:可以将Intent对象传递给startService()方法或bindService()方法以启动一个Service,该Intent对象包含了要启动的Service的

Android简单获取经纬度的方法_Android

本文实例讲述了Android简单获取经纬度的方法.分享给大家供大家参考,具体如下: public void getLoc() { // 位置 LocationManager locationManager; LocationListener locationListener; Location location; String contextService = Context.LOCATION_SERVICE; String provider; double lat; double lon; l

Android自定义dialog简单实现方法_Android

本文实例讲述了Android自定义dialog简单实现方法.分享给大家供大家参考,具体如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.function_music); // 实例化新的窗口 Window w = getWindow(); // 获取默认显示数据 Display display

android实现listview分页的方法_Android

本文实例讲述了android实现listview分页的方法.分享给大家供大家参考.具体分析如下: 最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset关键字,前者是查询每页展示的记录数,后者是越过多少记录数,说得明白点就是忽略前面多少行记录之后,取多少行记录 我分页采用了一个重要的类Page,通过封装Page类,做为参数传递进来,返回出去也是个Page对象 import java.util

Android编程动态按钮实现方法_Android

本文实例讲述了Android编程动态按钮实现方法.分享给大家供大家参考,具体如下: 第一种: 该方法通过onTouch来实现, btn3 = (ImageButton) findViewById(R.id.ImageButton03); btn3.setOnTouchListener(touchListener3); View.OnTouchListener touchListener = new OnTouchListener() { @Override public boolean onTo

Android编程之语音识别实现方法_Android

本文实例讲述了Android编程之语音识别实现方法.分享给大家供大家参考,具体如下: 语音识别技术在手机上应用得相当广泛,人类日常最频繁的沟通方式是语音,而在手机应用中,大部分是通过硬件手动输入,目前这依然是主要与手机互动的方式.但是随着手机软硬件功能的不断提升,可以预见在不久的将来,语音交流将是人机交互的主要方式.IPhone手机内置的Siri语音助手就是一个很好的例子.而鲜为人知的是其使用的语音识别技术来自于Google.而想而知,作为Google力推的Android自然被植入了最核心的语音

详解Android中IntentService的使用方法_Android

为什么我们需要IntentService ? Android中的IntentService是继承自Service类的,在我们讨论IntentService之前,我们先想一下Service的特点: Service的回调方法(onCreate.onStartCommand.onBind.onDestroy)都是运行在主线程中的.当我们通过startService启动Service之后,我们就需要在Service的onStartCommand方法中写代码完成工作,但是onStartCommand是运行