Jan*_*usz 164
似乎唯一的方法是使用模拟位置提供程序.
您必须在设置的开发面板中启用模拟位置并添加
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
到你的清单.
现在,您可以进入代码并创建自己的模拟位置提供程序并设置此提供程序的位置.
tom*_*ash 101
如果您仅在开发实验室中使用此手机,则有可能可以焊接GPS芯片并直接从其他设备使用NMEA序列馈送串行端口.
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).
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)
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)
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 您还会发现一些实际适用的代码我在模拟器上.
Android电子市场中提供了一些应用程序,可让您为设备指定"模拟GPS位置".
我搜索了https://market.android.com,发现了一个名为"我的假位置"的应用程序,对我有用.
保罗上面提到的模拟GPS提供商(http://www.cowlumbus.nl/forum/MockGpsProvider.zip)是另一个包含源代码的例子 - 虽然我无法安装提供的APK(它说失败[INSTALL_FAILED_OLDER_SDK]并且可能只需要重新编译)
要使用GPS模拟位置,您需要在设备设置中启用它.转到设置 - >应用程序 - >开发,然后选中"允许模拟位置"
然后,您可以使用上述应用程序来设置GPS坐标,Google地图和其他应用程序将使用您指定的模拟GPS位置.
这对我有用(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()将使用您点击的坐标触发.
我只是想出来,所以现在我不必在附近用手机偷听.
我创建了一个简单的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)
希望它可以帮助..
添加到您的清单
<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)
您还需要在设备开发人员设置中启用模拟位置。如果这不可用,请在实现上述内容后将“模拟位置应用程序”设置为您的应用程序。
通过icyerasor提到和佩德罗在提供的解决方案 http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ 工作对我非常好.但是,它不支持正确启动,停止和重新启动模拟GPS提供程序.
我已经改变了他的代码并将该类重写为AsyncTask而不是Thread.这允许我们与UI线程进行通信,因此我们可以在我们停止它的时候重新启动提供程序.当屏幕方向改变时,这会派上用场.
代码以及Eclipse的示例项目可以在GitHub上找到:https: //github.com/paulhoux/Android-MockProviderGPS
所有的功劳应归功于佩德罗所做的大部分艰苦工作.
| 归档时间: |
|
| 查看次数: |
236581 次 |
| 最近记录: |