设备上的Android模拟位置?

Isa*_*ler 146 gps android location mocking

如何在物理设备(Nexus One)上模拟我的位置?我知道您可以使用"仿真器控制"面板中的仿真器执行此操作,但这对物理设备不起作用.

Jan*_*usz 164

似乎唯一的方法是使用模拟位置提供程序.

您必须在设置的开发面板中启用模拟位置并添加

   <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
Run Code Online (Sandbox Code Playgroud)

到你的清单.

现在,您可以进入代码并创建自己的模拟位置提供程序并设置此提供程序的位置.

  • 市场上有一种名为"假GPS"的应用程序.如果您在设备上启用了Mock Locations,它会提供一个很好的GUI来设置您的位置.我意识到这不是一个自己动手的解决方案,但肯定是快速测试的有效解决方案. (83认同)
  • 应该更详细地解释声明"进入你的代码并创建你自己的模拟位置提供者". (5认同)
  • @TimGreen你的应该是接受的答案(不只是评论)!到目前为止最简单的测试方法 (4认同)
  • [this](http://pedroassuncao.com/2009/11/android-location-provider-mock/)可能是链接 - 相同的日期和相关内容. (2认同)

tom*_*ash 101

如果您仅在开发实验室中使用此手机,则有可能可以焊接GPS芯片并直接从其他设备使用NMEA序列馈送串行端口.

  • 仇敌为什么?这个答案是非常难的核心. (67认同)
  • 令人敬畏的硬核虽然非常无用/无关紧要. (60认同)
  • 嗯,我认为这个答案相关的任何人都知道他们可以做到这一点.我怀疑这三个人正在寻找一个解决方案的stackoverflow. (22认同)
  • 但是很有趣. (13认同)
  • 如果您无法确定如何在未焊接的设备中生成逼真的NMEA序列,那么有一个很棒的选择:焊接一个实际的外部GPS设备并将整个开发实验室移动到一个实际的轨道上,在一个跑步者/骑自行车的团队之上/汽车/飞机/取决于您想要模拟的速度.不要忘记在开发实验室的屋顶上打开一个洞,以便设备可以接收来自卫星的无线电信号.别客气.;-) (10认同)
  • 如果你不能拆开芯片,你可以随时建立一个无人机中队,配备与GPS卫星相同频率调谐的无线电,以高功率发射以阻塞真实信号,然后平凡地计算时间偏移到假的取决于所需的模拟位置.请注意,每个无人机必须在与最近的卫星通道相同的3个通道中发射,并且这些通道随着您的位置而变化.另请注意,您所在地区可能适用空域限制. (4认同)
  • 这样的耻辱通常与GSM/HSPA/EDGE/LTE/CDMA相同.厌恶SOC设计的原因;) (2认同)

Tim*_*een 32

我希望我的电缆方便.我知道你可以telnet到模拟器来改变它的位置

$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
Run Code Online (Sandbox Code Playgroud)

我不记得你是否可以telnet到你的设备,但我认为你可以.我希望这有帮助.

你需要adb(android调试桥)(CLI).

  • 这适用于模拟器,但不适用于实际设备.所以它根本没有回答OP的问题:( (14认同)
  • @TimGreen您的解决方案仅适用于模拟器.问题是关于真实设备. (3认同)

Vis*_*ath 28

您可以使用位置服务权限来模拟位置...

"android.permission.ACCESS_MOCK_LOCATION"

然后在你的java代码中

// Set location by setting the latitude, longitude and may be the altitude...
String[] MockLoc = str.split(",");
Location location = new Location(mocLocationProvider);            
Double lat = Double.valueOf(MockLoc[0]);
location.setLatitude(lat);
Double longi = Double.valueOf(MockLoc[1]);
location.setLongitude(longi);
Double alti = Double.valueOf(MockLoc[2]);
location.setAltitude(alti);
Run Code Online (Sandbox Code Playgroud)

  • 什么是mocLocationProvider的值? (9认同)
  • 例如LocationManager.GPS_PROVIDER (2认同)

Dr1*_*1Ku 24

我已经成功使用以下代码.虽然它出于某种原因让我一把锁(即使我尝试过不同的LatLng对),它对我有用.mLocationManager是一个LocationManager连接到LocationListener:

private void getMockLocation()
{
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
    mLocationManager.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 (/* TODO: Set Some Lat */);
    newLocation.setLongitude(/* TODO: Set Some Lng */);

    newLocation.setAccuracy(500);

    mLocationManager.setTestProviderEnabled
    (
      LocationManager.GPS_PROVIDER, 
      true
    );

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

    mLocationManager.setTestProviderLocation
    (
      LocationManager.GPS_PROVIDER, 
      newLocation
    );      
}
Run Code Online (Sandbox Code Playgroud)

  • 加上1表示方法addTestProvider中表示true(s)和false(s)的方式 (2认同)

icy*_*sor 14

Dr1Ku发布了什么作品.今天使用了代码,但需要添加更多的loc.所以这里有一些改进:

可选:您可能希望定义自己的constat PROVIDER_NAME并使用它,而不是使用LocationManager.GPS_PROVIDER字符串.注册位置更新时,请通过条件选择提供程序,而不是直接将其指定为字符串.

第一:不要调用removeTestProvider,而是首先检查是否有要删除的提供程序(以避免IllegalArgumentException):

if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
  mLocationManager.removeTestProvider(PROVIDER_NAME);
}
Run Code Online (Sandbox Code Playgroud)

第二:要发布多个位置,您必须设置该位置的时间:

newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
Run Code Online (Sandbox Code Playgroud)

似乎还有一个使用MockLocationProviders的谷歌测试:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

另一个好的工作示例可以在以下网址找到:http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

另一篇好文章是:http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 您还会发现一些实际适用的代码我在模拟器上.


fij*_*ron 9

Android电子市场中提供了一些应用程序,可让您为设备指定"模拟GPS位置".

我搜索了https://market.android.com,发现了一个名为"我的假位置"的应用程序,对我有用.

保罗上面提到的模拟GPS提供商(http://www.cowlumbus.nl/forum/MockGpsProvider.zip)是另一个包含源代码的例子 - 虽然我无法安装提供的APK(它说失败[INSTALL_FAILED_OLDER_SDK]并且可能只需要重新编译)

要使用GPS模拟位置,您需要在设备设置中启用它.转到设置 - >应用程序 - >开发,然后选中"允许模拟位置"

然后,您可以使用上述应用程序来设置GPS坐标,Google地图和其他应用程序将使用您指定的模拟GPS位置.


Chr*_*s B 8

这对我有用(Android Studio):

禁用手机上的GPS和WiFi跟踪.在Android 5.1.1及更低版本中,在"开发者选项"中选择"启用模拟位置".

在src/debug目录中制作清单的副本.添加以下内容(在"application"标记之外):

uses-permission android:name ="android.permission.ACCESS_MOCK_LOCATION"

设置一个名为"map"的地图片段.在onCreate()中包含以下代码:

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
if (lm.getProvider("Test") == null) {
    lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1);
}
lm.setTestProviderEnabled("Test", true);
lm.requestLocationUpdates("Test", 0, 0, ll);

map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng l) {
        Location loc = new Location("Test");
        loc.setLatitude(l.latitude);
        loc.setLongitude(l.longitude);
        loc.setAltitude(0); 
        loc.setAccuracy(10f);
        loc.setElapsedRealtimeNanos(System.nanoTime());
        loc.setTime(System.currentTimeMillis()); 
        lm.setTestProviderLocation("Test", loc);
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须暂时将模块gradle文件中的"minSdkVersion"增加到17才能使用"setElapsedRealtimeNanos"方法.

在主活动类中包含以下代码:

private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // do whatever you want, scroll the map, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

使用AS运行您的应用程序.在Android 6.0及更高版本上,您将获得安全性异常.现在转到设置中的开发者选项,然后选择"选择模拟位置应用".从列表中选择您的应用程序.

现在,当您点击地图时,onLocationChanged()将使用您点击的坐标触发.

我只是想出来,所以现在我不必在附近用手机偷听.


smo*_*ora 7

我创建了一个简单的Handler,模拟从初始位置开始的移动位置.

在连接回调中启动它:

private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
    @Override
    public void onConnected(Bundle bundle) {
        if (BuildConfig.USE_MOCK_LOCATION) {
            LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true);
            new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }
};
Run Code Online (Sandbox Code Playgroud)

Handler类:

   private static class MockLocationMovingHandler extends Handler {

    private final static int SET_MOCK_LOCATION = 0x000001;
    private final static double STEP_LATITUDE =  -0.00005;
    private final static double STEP_LONGITUDE = 0.00002;
    private final static long FREQUENCY_MS = 1000;
    private GoogleApiClient mGoogleApiClient;
    private double mLatitude;
    private double mLongitude;

    public MockLocationMovingHandler(final GoogleApiClient googleApiClient) {
        super(Looper.getMainLooper());
        mGoogleApiClient = googleApiClient;
    }

    public void start(final double initLatitude, final double initLongitude) {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
        mLatitude = initLatitude;
        mLongitude = initLongitude;
        sendEmptyMessage(SET_MOCK_LOCATION);
    }

    public void stop() {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
    }

    @Override
    public void handleMessage(Message message) {
        switch (message.what) {
            case SET_MOCK_LOCATION:
                Location location = new Location("network");
                location.setLatitude(mLatitude);
                location.setLongitude(mLongitude);
                location.setTime(System.currentTimeMillis());
                location.setAccuracy(3.0f);
                location.setElapsedRealtimeNanos(System.nanoTime());
                LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location);

                mLatitude += STEP_LATITUDE;
                mLongitude += STEP_LONGITUDE;
                sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS);
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助..


Ian*_*n M 7

添加到您的清单

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
    tools:ignore="MockLocation,ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)

模拟定位功能

void setMockLocation() {
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false,
            false, false, true, true, true, 0, 5);
    locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);

    Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
    mockLocation.setLatitude(-33.852);  // Sydney
    mockLocation.setLongitude(151.211);
    mockLocation.setAltitude(10);
    mockLocation.setAccuracy(5);
    mockLocation.setTime(System.currentTimeMillis());
    mockLocation.setElapsedRealtimeNanos(System.nanoTime());
    locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation);
}
Run Code Online (Sandbox Code Playgroud)

您还需要在设备开发人员设置中启用模拟位置。如果这不可用,请在实现上述内容后将“模拟位置应用程序”设置为您的应用程序。


Pau*_*oux 6

通过icyerasor提到和佩德罗在提供的解决方案 http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ 工作对我非常好.但是,它不支持正确启动,停止和重新启动模拟GPS提供程序.

我已经改变了他的代码并将该类重写为AsyncTask而不是Thread.这允许我们与UI线程进行通信,因此我们可以在我们停止它的时候重新启动提供程序.当屏幕方向改变时,这会派上用场.

代码以及Eclipse的示例项目可以在GitHub上找到:https: //github.com/paulhoux/Android-MockProviderGPS

所有的功劳应归功于佩德罗所做的大部分艰苦工作.