Android 模拟 GPS 卫星(不仅仅是位置)
Android emulate GPS satellites (not only location)
我正在寻找一种在 Android 模拟器中模拟卫星存在的方法。
我可以通过 telnet 作为 "geo fix" 提交 lon/lat 对,这在 google 地图或类似应用程序中工作正常,或者通过扩展控件重播 .kml 文件。问题是其他应用程序(例如,chartcross 的 GPS 测试)仍然抱怨 GPS 信号丢失或找不到卫星。
也尝试发送 nmea 语句,但可能格式有误,因为即使在 google 地图中它也没有更改位置:
geo nmea $GPGGA,090000.00,4452.85370156,N,06330.55438023,W,1,05,2.87,160.00,M,-21.3213,M,,*61
经过大量挖掘,最后我切换到原生 Android 的 API 通过 Mock Locations
设置 Lat/Long
NMEA 作用于系统调用之下的层,它通常对应用程序不可见
综上所述,这是Android:
中GPS数据的大概流向
GPS 设备 => GPS 驱动程序 =(NMEA 坐标)=> Android GPS 引擎 =(Lat/Long 坐标)=> Android 服务层 <=> 各种 API 来自应用程序的调用
因此,为了模拟地点,不需要走那么深。 99% 的应用程序依赖服务层的数据,因此您可以轻松混淆系统的 GPS_PROVIDER:
import android.content.Context;
import android.location.*;
import android.os.SystemClock;
import android.util.Log;
/**
* Created by the.Legend on 17/07/2016.
*/
public class FakeGPS {
private LocationManager locationManager;
public static final String GPS_MOCK_PROVIDER = "gps";
public FakeGPS(){
locationManager = (LocationManager) Environment.mainContext.getSystemService(Context.LOCATION_SERVICE);
if(!locationManager.isProviderEnabled(GPS_MOCK_PROVIDER)) {
locationManager.addTestProvider(GPS_MOCK_PROVIDER, false, false,
false, false, true, false, false, 0, 5);
locationManager.setTestProviderEnabled(GPS_MOCK_PROVIDER, true);
locationManager.setTestProviderStatus(GPS_MOCK_PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis());
}
}
public void applyCoordinates( Double longitude, Double latitude){
if(locationManager.isProviderEnabled(GPS_MOCK_PROVIDER)) {
Double altitude= 0.0;
Float accuracy=3.0f;
long timestamp=System.currentTimeMillis();
try {
Location location = new Location(LocationManager.GPS_PROVIDER);
location.setLatitude(latitude);
location.setLongitude(longitude);
location.setAltitude(altitude);
location.setAccuracy(accuracy);
location.setTime(timestamp);
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); locationManager.setTestProviderLocation(GPS_MOCK_PROVIDER, location);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
我正在寻找一种在 Android 模拟器中模拟卫星存在的方法。 我可以通过 telnet 作为 "geo fix" 提交 lon/lat 对,这在 google 地图或类似应用程序中工作正常,或者通过扩展控件重播 .kml 文件。问题是其他应用程序(例如,chartcross 的 GPS 测试)仍然抱怨 GPS 信号丢失或找不到卫星。
也尝试发送 nmea 语句,但可能格式有误,因为即使在 google 地图中它也没有更改位置:
geo nmea $GPGGA,090000.00,4452.85370156,N,06330.55438023,W,1,05,2.87,160.00,M,-21.3213,M,,*61
经过大量挖掘,最后我切换到原生 Android 的 API 通过 Mock Locations
设置 Lat/LongNMEA 作用于系统调用之下的层,它通常对应用程序不可见 综上所述,这是Android:
中GPS数据的大概流向GPS 设备 => GPS 驱动程序 =(NMEA 坐标)=> Android GPS 引擎 =(Lat/Long 坐标)=> Android 服务层 <=> 各种 API 来自应用程序的调用
因此,为了模拟地点,不需要走那么深。 99% 的应用程序依赖服务层的数据,因此您可以轻松混淆系统的 GPS_PROVIDER:
import android.content.Context;
import android.location.*;
import android.os.SystemClock;
import android.util.Log;
/**
* Created by the.Legend on 17/07/2016.
*/
public class FakeGPS {
private LocationManager locationManager;
public static final String GPS_MOCK_PROVIDER = "gps";
public FakeGPS(){
locationManager = (LocationManager) Environment.mainContext.getSystemService(Context.LOCATION_SERVICE);
if(!locationManager.isProviderEnabled(GPS_MOCK_PROVIDER)) {
locationManager.addTestProvider(GPS_MOCK_PROVIDER, false, false,
false, false, true, false, false, 0, 5);
locationManager.setTestProviderEnabled(GPS_MOCK_PROVIDER, true);
locationManager.setTestProviderStatus(GPS_MOCK_PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis());
}
}
public void applyCoordinates( Double longitude, Double latitude){
if(locationManager.isProviderEnabled(GPS_MOCK_PROVIDER)) {
Double altitude= 0.0;
Float accuracy=3.0f;
long timestamp=System.currentTimeMillis();
try {
Location location = new Location(LocationManager.GPS_PROVIDER);
location.setLatitude(latitude);
location.setLongitude(longitude);
location.setAltitude(altitude);
location.setAccuracy(accuracy);
location.setTime(timestamp);
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); locationManager.setTestProviderLocation(GPS_MOCK_PROVIDER, location);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}