我正在尝试开发一个通过Google导航应用程序模拟路由的应用程序.我在本网站的其他一些帖子(
Android mock location on device?)中发现了如何实现模拟位置提供商的一些很好的例子.
通过对源代码 http://www.cowlumbus.nl/forum/MockGpsProvider.zip的简单修改,我的模拟位置显示在Google的Google Maps应用程序中. (唯一的更改是位置管理器GPS_PROVIDER的模拟提供者名称).
我的问题是当我打开导航应用程序时,它显示“搜索GPS信号”.我仍然看到我的位置在地图上移动;但是,它不会生成到目的地的路由.我想知道有没有人知道我需要做什么来伪造导航,看到我的模拟位置作为GPS信号.
谢谢.
通过对源代码 http://www.cowlumbus.nl/forum/MockGpsProvider.zip的简单修改,我的模拟位置显示在Google的Google Maps应用程序中. (唯一的更改是位置管理器GPS_PROVIDER的模拟提供者名称).
我的问题是当我打开导航应用程序时,它显示“搜索GPS信号”.我仍然看到我的位置在地图上移动;但是,它不会生成到目的地的路由.我想知道有没有人知道我需要做什么来伪造导航,看到我的模拟位置作为GPS信号.
谢谢.
- public class MockGpsProviderActivity extends Activity implements LocationListener {
- private MockGpsProvider mMockGpsProviderTask = null;
- private Integer mMockGpsProviderIndex = 0;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- String mocLocationProvider = LocationManager.GPS_PROVIDER;
- locationManager.addTestProvider(mocLocationProvider,false,true,5);
- locationManager.setTestProviderEnabled(mocLocationProvider,true);
- locationManager.requestLocationUpdates(mocLocationProvider,this);
- try {
- List<String> data = new ArrayList<String>();
- InputStream is = getAssets().open("test.csv");
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- String line = null;
- while ((line = reader.readLine()) != null) {
- data.add(line);
- }
- // convert to a simple array so we can pass it to the AsyncTask
- String[] coordinates = new String[data.size()];
- data.toArray(coordinates);
- // create new AsyncTask and pass the list of GPS coordinates
- mMockGpsProviderTask = new MockGpsProvider();
- mMockGpsProviderTask.execute(coordinates);
- }
- catch (Exception e) {}
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- // stop the mock GPS provider by calling the 'cancel(true)' method
- try {
- mMockGpsProviderTask.cancel(true);
- mMockGpsProviderTask = null;
- }
- catch (Exception e) {}
- // remove it from the location manager
- try {
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- locationManager.removeTestProvider(MockGpsProvider.GPS_MOCK_PROVIDER);
- }
- catch (Exception e) {}
- }
- @Override
- public void onLocationChanged(Location location) {
- // show the received location in the view
- TextView view = (TextView) findViewById(R.id.text);
- view.setText( "index:" + mMockGpsProviderIndex
- + "\nlongitude:" + location.getLongitude()
- + "\nlatitude:" + location.getLatitude()
- + "\naltitude:" + location.getAltitude() );
- }
- @Override
- public void onProviderDisabled(String provider) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onProviderEnabled(String provider) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onStatusChanged(String provider,int status,Bundle extras) {
- // TODO Auto-generated method stub
- }
- /** Define a mock GPS provider as an asynchronous task of this Activity. */
- private class MockGpsProvider extends AsyncTask<String,Integer,Void> {
- public static final String LOG_TAG = "GpsMockProvider";
- public static final String GPS_MOCK_PROVIDER = "GpsMockProvider";
- /** Keeps track of the currently processed coordinate. */
- public Integer index = 0;
- @Override
- protected Void doInBackground(String... data) {
- // process data
- for (String str : data) {
- // skip data if needed (see the Activity's savedInstanceState functionality)
- if(index < mMockGpsProviderIndex) {
- index++;
- continue;
- }
- // let UI Thread know which coordinate we are processing
- publishProgress(index);
- // retrieve data from the current line of text
- Double latitude = null;
- Double longitude = null;
- Double altitude= null;
- try {
- String[] parts = str.split(",");
- latitude = Double.valueOf(parts[0]);
- longitude = Double.valueOf(parts[1]);
- altitude = Double.valueOf(parts[2]);
- }
- catch(NullPointerException e) { break; } // no data available
- catch(Exception e) { continue; } // empty or invalid line
- // translate to actual GPS location
- Location location = new Location(LocationManager.GPS_PROVIDER);
- location.setLatitude(latitude);
- location.setLongitude(longitude);
- location.setAltitude(altitude);
- location.setTime(System.currentTimeMillis());
- // show debug message in log
- Log.d(LOG_TAG,location.toString());
- // provide the new location
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER,location);
- // sleep for a while before providing next location
- try {
- Thread.sleep(200);
- // gracefully handle Thread interruption (important!)
- if(Thread.currentThread().isInterrupted())
- throw new InterruptedException("");
- } catch (InterruptedException e) {
- break;
- }
- // keep track of processed locations
- index++;
- }
- return null;
- }
- @Override
- protected void onProgressUpdate(Integer... values) {
- Log.d(LOG_TAG,"onProgressUpdate():"+values[0]);
- mMockGpsProviderIndex = values[0];
- }
- }
- }
解决方法
这是我所缺少的:
- location.setLatitude(latitude);
- location.setLongitude(longitude);
- location.setAccuracy(16F);
- location.setAltitude(0D);
- location.setTime(System.currentTimeMillis());
- location.setBearing(0F);
此外,重要的是计算导航轴承.否则,路由更新将不准确.