设备上的Android模拟位置?
我怎样才能嘲笑我的位置在一个物理设备(Nexus One)? 我知道你可以使用仿真器控制面板中的仿真器来做到这一点,但是这对于物理设备不起作用。
似乎唯一的办法是使用模拟位置提供程序。
您必须在设置中的开发面板中启用模拟位置并添加
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
到你的清单。
现在,您可以进入您的代码并创build您自己的模拟位置提供程序并设置此提供程序的位置。
如果您只在开发实验室使用这款手机,您可以直接使用其他设备的NMEA序列来焊接GPS芯片和串行端口。
我希望我的电缆很方便。 我知道你可以telnet到模拟器来改变它的位置
$ telnet localhost 5554 Android Console: type 'help' for a list of commands OK geo fix -82.411629 28.054553 OK
我不记得你是否可以telnet到你的设备,但我认为你可以。 我希望这有帮助。
你需要adb(androiddebugging桥)来实现这个(CLI)。
您可以使用位置服务权限来模拟位置…
"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);
我已经成功使用下面的代码。 尽pipe由于某种原因,我得到了一个单一的锁(即使我尝试了不同的LatLng对),它为我工作。 mLocationManager
是连接到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 ); }
Dr1Ku发布的作品。 今天使用的代码,但需要添加更多的loc。 所以这里有一些改进:
可选:不使用LocationManager.GPS_PROVIDERstring,您可能需要定义自己的常量PROVIDER_NAME并使用它。 在注册位置更新时,通过标准select提供者,而不是直接在string中指定它。
首先:不要调用removeTestProvider,首先检查是否有提供者被删除(以避免IllegalArgumentException):
if (mLocationManager.getProvider(PROVIDER_NAME) != null) { mLocationManager.removeTestProvider(PROVIDER_NAME); }
第二:要发布多个位置,您必须设置位置的时间:
newLocation.setTime(System.currentTimeMillis()); ... mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
也似乎有一个谷歌testing使用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你还会发现一些实际上适用于我在模拟器上。
Android电子市场中有可用的应用程序,可让您为设备指定“模拟GPS位置”。
我search了https://market.android.com,并find了一个名为“我的假地点”的应用程序,适合我。;
上面Paul提到的模拟GPS提供商( forum/MockGpsProvider.zip )是另一个包含源代码的例子 – 虽然我无法安装提供的APK(它说失败[INSTALL_FAILED_OLDER_SDK],可能只是需要重新编译)
为了使用GPS模拟位置,您需要在设备设置中启用它。 进入设置 – >应用程序 – >开发并选中“允许模拟位置”
然后,您可以使用上述应用程序设置GPS坐标,Google地图和其他应用程序将使用您指定的模拟GPS位置。
我创build了一个简单的Handler模拟从初始位置移动的位置。
在连接callback中启动它:
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) { } };
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; } } }
希望它可以帮助..
这适用于我(Android Studio):
在手机上禁用GPS和WiFi跟踪。 在Android 5.1.1及以下版本中,select“开发人员选项”中的“启用模拟位置”。
在src / debug目录下制作清单的副本。 添加以下内容(“应用程序”标签之外):
使用权限android:name =“android.permission.ACCESS_MOCK_LOCATION”
设置一个名为“地图”的地图片段。 在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); } };
请注意,为了使用“setElapsedRealtimeNanos”方法,您可能需要暂时将模块gradle文件中的“minSdkVersion”增加到17。
在主活动类中包含以下代码:
private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { // do whatever you want, scroll the map, etc. } }
用AS运行你的应用程序。 在Android 6.0及以上版本中,您将获得安全性例外。 现在转到设置中的开发人员选项,然后select“select模拟位置应用程序”。 从列表中select您的应用程序。
现在,当你点击地图时,onLocationChanged()将会用你的水龙头的坐标点燃。
我只是明白了这一点,所以现在我不必手机上的手机周围。
icyerasor提供的解决scheme,由Pedro在http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/提供的解决scheme对我来说工作得非常好。; 但是,它不提供正确启动,停止和重新启动模拟GPS提供程序的支持。
我已经改变了自己的一些代码,并将其重写为AsyncTask而不是Thread。 这使我们能够与UI线程进行通信,所以我们可以在我们停止时重新启动提供程序。 当屏幕方向改变时,这将派上用场。
这个代码以及Eclipse的示例项目可以在GitHub上find: https : //github.com/paulhoux/Android-MockProviderGPS
所有的信贷都应该去佩德罗做大部分的辛苦工作。
从谷歌播放假GPS应用程序为我做了伎俩。 只要确保您阅读了应用说明中的所有说明。 您必须禁用其他位置服务以及启用“假GPS”后启动您的应用程序。 为了我所需要的而努力工作。
以下是GooglePlay上应用的链接: 假GPS
Google教程可以在这里find,它提供了代码示例并解释了这个过程。
http://developer.android.com/training/location/location-testing.html#SendMockLocations
如果您的设备已插入您的计算机,并且尝试更改发送GPS线通过仿真器控制,则无法工作。
这是一个EMULATOR控制的原因。
只需设置它即可更新GPS更新。
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); ll = new LocationListener() { public void onLocationChanged(Location location) { // Called when a new location is found by the network location provider. onGPSLocationChanged(location); } public void onStatusChanged(String provider, int status, Bundle extras) { bigInfo.setText("Changed "+ status); } public void onProviderEnabled(String provider) { bigInfo.setText("Enabled "+ provider); } public void onProviderDisabled(String provider) { bigInfo.setText("Disabled "+ provider); } };
当GPS更新时,重写下面的方法来做你想做的事情;
public void onGPSLocationChanged(Location location){ if(location != null){ double pLong = location.getLongitude(); double pLat = location.getLatitude(); textLat.setText(Double.toString(pLat)); textLong.setText(Double.toString(pLong)); if(autoSave){ saveGPS(); } } }
不要忘记把这些放在清单中
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION
安装假GPS应用程序https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en
开发者选项 – > select模拟位置的应用程序 (这意味着,select了假的位置应用程序)。
假GPS应用程序 :
在地图上双击标签添加 – >点击播放button – >显示吐司“假停止位置”
最后检查谷歌地图应用程序。
我想知道你是否需要精心devise的模拟位置。 在我的情况下,一旦我有一个固定的位置,我正在调用一个函数来做一些新的位置。 在一个计时器中创build一个模拟位置。 然后调用该位置的function。 在短时间内知道GPS会产生一个真实的当前位置。 哪个好。 如果你有足够长的更新时间。
也许这不是“程序员”的做法,但是如果您想节省您的时间并立即获得工作解决scheme,请尝试一下专门用于在Google Play中提供模拟位置的应用程序:
假GPS位置欺骗者
模拟位置
假GPS位置
我编写了一个应用程序,在您的Android手机上运行WebServer(REST-Like),以便您可以远程设置GPS位置 。 该网站提供了一个地图,你可以点击设置一个新的位置,或使用“wasd”键向任何方向移动。 该应用程序是一个快速的解决scheme,所以几乎没有用户界面和文档,但实施是直截了当的,你可以在(只有四个)类看起来一切。
项目存储库: https : //github.com/juliusmh/RemoteGeoFix
在清单文件中使用此权限
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
android studio会build议“只有在testing或特定于debugging的清单文件(通常是src / debug / AndroidManifest.xml)中才能请求模拟位置”只是禁用检查
现在请确保您在手机的开发者设置中选中了“ 允许模拟位置 ”
使用LocationManager
locationManager.addTestProvider(mocLocationProvider, false, false, false, false, true, true, true, 0, 5); locationManager.setTestProviderEnabled(mocLocationProvider, true);
现在设置所需的位置
Location mockLocation = new Location(mocLocationProvider); mockLocation.setLatitude(lat); mockLocation.setLongitude(lng); mockLocation.setAltitude(alt); mockLocation.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation(mocLocationProvider,mockLocation);