2011-08-15 5 views
10

Googleのナビゲーションアプリケーションでルートをシミュレートするアプリケーションを開発しようとしています。私はこのウェブサイトのいくつかの他の投稿(Android mock location on device?)にモックロケーションプロバイダを実装する方法の優れた例をいくつか見つけました。
ソースコードhttp://www.cowlumbus.nl/forum/MockGpsProvider.zipを簡単に変更すると、私のモックの場所がGoogleのマップアプリケーションに表示されます。 (唯一の変更は、LocationManager.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, 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]; 
    } 
} 
} 

答えて

3

は私が欠けていたものです。

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

をまた、ナビゲーションのための軸受をcalcaulteすることが重要です。そうしないと、ルートの更新が不正確になります。

+0

[JBデバイスの詳細](http://jgrasstechtips.blogspot.com/2012/12/android-incomplete-location-object.html) – Paul

+0

モックロケーションでボイスナビゲーションを使用したことはありますか?経路は再計算されますが、アプリを起動した後は音声ナビゲーションが表示されません。 – AndroidDev93

+0

申し訳ありませんが、以前はこれが見えませんでした。はい、すべてがうまくいきます。あなたが私が助けることができる特定の質問がある場合は、私に教えてください。 – Paul

関連する問題