当前位置: 首页 > 知识库问答 >
问题:

如何设置Android模拟GPS位置?

狄飞尘
2023-03-14

我有一个问题,而试图使用Android模拟位置,我的主要目标是设置Android GPS认为我们在一个不同的地方,又名假GPS。

我目前尝试了两种不同的类似解决方案,可在这两个网站上使用:

  • 编程丛林
  • 莫比亚奇

这两个教程都是2012年的,我不知道它们是否过时,或者我很难实现它们。

首先,我要确保我有权限:

  1. ACCESS_COARSE_LOCATION
  2. ACCESS_FINE_LOCATION
  3. ACCESS_MOCK_LOCATION*

注意:1和2都已选中,如果它们不可用,我将使用requestPermissions功能请求权限。第三个不能被请求,事实上它只能通过AndroidManifest添加。调试模式下的xml。

我还确保在“设置”中选择了我的应用程序

在所有这些之后,我创建了这个函数,我尝试通过OnCreate方法或单击按钮调用它:

public void mockLocation(){
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy( Criteria.ACCURACY_FINE );
    String mocLocationProvider = lm.getBestProvider( criteria, true );
    if ( mocLocationProvider == null ) {
        Toast.makeText(getApplicationContext(), "No location provider found!", Toast.LENGTH_SHORT).show();
        return;
    }
    lm.addTestProvider(mocLocationProvider, false, false,
            false, false, true, true, true, 0, 5);
    lm.setTestProviderEnabled(mocLocationProvider, true);

    Location loc = new Location(mocLocationProvider);
    Location mockLocation = new Location(mocLocationProvider); // a string
    mockLocation.setLatitude(-26.902038);  // double
    mockLocation.setLongitude(-48.671337);
    mockLocation.setAltitude(loc.getAltitude());
    mockLocation.setTime(System.currentTimeMillis());
    lm.setTestProviderLocation( mocLocationProvider, mockLocation);
    Toast.makeText(getApplicationContext(), "Working", Toast.LENGTH_SHORT).show();
}

如果我以这种方式编译和测试,我将收到Toast:“找不到位置提供程序!”。但如果我将MoLocationProvider更改为:

String mocLocationProvider = LocationManager.NETWORK_PROVIDER;

我得到应用程序崩溃,在LogCat中它说在这一行中崩溃:

lm.setTestProviderLocation(mocLocationProvider, mockLocation);

所以我目前别无选择,不知道如何前进。

共有3个答案

毋胜涝
2023-03-14

根据@Blackkara的回答和评论,这是最终代码,不要忘记将定位模式设置为仅限设备(GPS)

    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy( Criteria.ACCURACY_FINE );

    String mocLocationProvider = LocationManager.GPS_PROVIDER;//lm.getBestProvider( criteria, true );

    if ( mocLocationProvider == null ) {
        Toast.makeText(getApplicationContext(), "No location provider found!", Toast.LENGTH_SHORT).show();
        return;
    }
    lm.addTestProvider(mocLocationProvider, false, false,
            false, false, true, true, true, 0, 5);
    lm.setTestProviderEnabled(mocLocationProvider, true);

    Location loc = new Location(mocLocationProvider);
    Location mockLocation = new Location(mocLocationProvider); // a string
    mockLocation.setLatitude(-26.902038);  // double
    mockLocation.setLongitude(-48.671337);
    mockLocation.setAltitude(loc.getAltitude());
    mockLocation.setTime(System.currentTimeMillis());
    mockLocation.setAccuracy(1);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
    }
    lm.setTestProviderLocation( mocLocationProvider, mockLocation);
    Toast.makeText(getApplicationContext(), "Working", Toast.LENGTH_SHORT).show();
滕星纬
2023-03-14

必须设置精度和ElapsedRealTimeNano值

location.setAccuracy(...);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}

否则它将抛出IllegalArgumentException。

@如果位置不完整,则引发IllegalArgumentException

更新

如果你嘲笑网络提供商

String mocLocationProvider = LocationManager.NETWORK_PROVIDER;

然后您将通过网络提供商接收模拟位置,

LocationListener listener = new LocationListener(){
    ...
    void onLocationChanged(Location location){

    }
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, ..., listener);

无论何时调用setTestProviderLocation方法,都会触发onLocationChanged回调!

赵俊远
2023-03-14

必须首先设置:

在设置中允许模拟位置

第二组权限:

访问\u粗略\u位置访问\u精细\u位置访问\u模拟\u位置

第三,使用这种方法:

setMock(一些时间,一些时间,一些精度);

private void setMock(double latitude, double longitude, float accuracy) {
 locMgr.addTestProvider (LocationManager.GPS_PROVIDER,
            "requiresNetwork" == "",
            "requiresSatellite" == "",
            "requiresCell" == "",
            "hasMonetaryCost" == "",
            "supportsAltitude" == "",
            "supportsSpeed" == "",
            "supportsBearing" == "",
            android.location.Criteria.POWER_LOW,
            android.location.Criteria.ACCURACY_FINE);

    Location newLocation = new Location(LocationManager.GPS_PROVIDER);

    newLocation.setLatitude(latitude);
    newLocation.setLongitude(longitude);
    newLocation.setAccuracy(accuracy);
    newLocation.setAltitude(0);
    newLocation.setAccuracy(500);
    newLocation.setTime(System.currentTimeMillis());
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
    }
    locMgr.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);

    locMgr.setTestProviderStatus(LocationManager.GPS_PROVIDER,
            LocationProvider.AVAILABLE,
            null,System.currentTimeMillis());

    locMgr.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation);}
 类似资料:
  • 在eclipse中,您可以使用以下命令为模拟器设置GPS位置: 选择窗口 在模拟器控制面板中,在位置控制下输入GPS坐标作为单独的经纬度坐标,并使用GPX文件进行路线回放,或使用KML文件进行多个地点标记。(确保您在“设备”面板中选择了一个设备——可从窗口访问 这在Android Studio可能吗?

  • 问题内容: 我正在开发一个可获取用户指定的纬度,经度和海拔高度的APP,然后在手机上伪造该GPS位置,并在Google地图中显示我位于该位置。我对清单文件具有必需的权限,并且在开发人员设置中启用了模拟位置。 但是看起来我的GPS位置在Google地图上根本没有改变,这是什么问题? 更新:我刚刚在手机上安装了一个名为“ fake GPS location”的应用程序,该应用程序可以正常运行,但是我仍

  • 问题内容: 干杯,我正在尝试通过Android获取当前的GPS位置。我也遵循了这篇教程和Vogellas的文章。虽然没有用。使用LocationManager.NETWORK_PROVIDER时,无论我站在哪里,我总能得到51的纬度和9的经度。当使用LocationManager.GPS_PROVIDER时,我什么也没得到。 虽然使用GMaps时一切正常::S不知道为什么。如何像GMaps一样获取

  • 问题内容: 我正在尝试在android模拟器上使用gps,我有以下代码: 我在清单中添加了以下行: 并且我已经使用DDMS方法和geo fix方法设置了gps位置,但是当我运行代码时,我在Toast行上得到了一个N​​ullPointerExeption,可能是因为loc为空。 我不知道错误在哪里…您能帮我吗? 更新! 感谢您的帮助,现在我使用以下代码,但没有收到任何错误,但是它不会在onChan

  • 我们知道有各种各样的应用程序,比如假冒我的GPS等等。但是这些应用程序使用开发者选项来激活模拟位置。检测模拟位置的应用程序通常会检查权限是否打开,并使用以下代码: 使用权限android: name="android.permission.ACCESS_MOCK_LOCATION"/ 我想知道是否有一种方法可以欺骗(更改)位置,而无需更改设备根目录或在Android上激活模拟位置设置。

  • 我有一个Android应用程序,它使用一个模拟GPS定位提供商将纬度/经度坐标输入谷歌地图导航应用程序。该应用程序适用于所有Android 4.2之前的设备,但不适用于Nexus 10。我今天做了一些研究,但没能弄清楚是什么改变了 问题似乎是LocationManager没有用新坐标更新。运行4.1的设备上的logcat的以下行(第一行来自LocationManager,第二行来自我的应用程序):