2011-08-15 18 views
10

Google'ın Navigasyon uygulaması aracılığıyla bir rota simüle edecek bir uygulama geliştirmeye çalışıyorum. Bu web sitesinde (Android mock location on device?) başka sitelerde sahte konum sağlayıcısının nasıl uygulanacağına dair mükemmel örnekler buldum.
http://www.cowlumbus.nl/forum/MockGpsProvider.zip kaynak kodunda yapılan basit bir değişiklikle, sahte konumum Google'ın Haritalar uygulamasında görünür. (Tek değişiklik, LocationManager.GPS_PROVIDER öğesinin sahte sağlayıcı adıdır).
Sorunum, Navigasyon uygulamasını açtığımda "GPS sinyali aranıyor" diyor. Konumumun harita üzerinde hareket ettiğini hala görüyorum; Ancak, hedefe bir rota oluşturmaz. GPS sinyali olarak sahte konumumu görmek için Gezinme'yi yapmak için ne yapmam gerektiğini bilen biri olup olmadığını merak ediyordum.
Teşekkürler. İşteGezinme Uygulamasında Sahte Konum Kullanma

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, false, 
      false, false, true, false, false, 0, 5); 
    locationManager.setTestProviderEnabled(mocLocationProvider, true); 
    locationManager.requestLocationUpdates(mocLocationProvider, 0, 0, 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]; 
    } 
} 
} 

cevap

3

Ben eksikti budur:

location.setLatitude(latitude); 
location.setLongitude(longitude); 
location.setAccuracy(16F); 
location.setAltitude(0D); 
location.setTime(System.currentTimeMillis()); 
location.setBearing(0F); 

Ayrıca, navigasyon için yatağı calcaulte önemlidir. Aksi takdirde, rota güncellemeleri yanlış olur.

+0

[JB devices] için daha fazla bilgi (http://jgrasstechtips.blogspot.com/2012/12/android-incomplete-location-object.html) – Paul

+0

Hiç Mock Locations ile Voice Navigation ile çalıştınız mı? Rota yeniden hesaplanır, ancak uygulamayı başlattıktan sonra herhangi bir sesli navigasyon almam gerekir. – AndroidDev93

+0

Daha önce bunu görmediğim için üzgünüm. Evet, her şey benim için iyi çalışıyor. Yardım edebileceğim özel bir sorunuz varsa lütfen bize bildirin. – Paul

İlgili konular