2015-07-13 18 views
5

Ho cercato di implementare una funzionalità per la mia app per Android che ottiene la velocità e la direzione di marcia del dispositivo, indipendentemente da dove sia puntato il dispositivo. Ad esempio: se il mio dispositivo Android è puntato nella direzione nord e se mi sto spostando all'indietro nella direzione sud, tornerebbe che mi sto spostando verso sud.Location Android getBearing() restituisce sempre 0

Mi sono guardato intorno e ho avuto la possibilità di utilizzare il metodo getBearing() di Location (ancora, non so se questo risolverà tutto il mio problema). Quando invoco getBearing(), restituisce sempre 0.0 per qualche motivo. Non ho idea del perché. Ecco il mio codice:

LocationManager lm; 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gcm); 
    setUpUI(findViewById(R.id.LinearLayout1)); 
    isRegged = false; 

    // GCM startup 
    gcm = GoogleCloudMessaging.getInstance(this); 
    context = getApplicationContext(); 

    gps = new GPSTracker(context); 
    // gps.startListening(context); 
    // gps.setGpsCall(this); 

    /* 
    * Variables to indicate location and device ID 
    */ 
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

    if (gps.getIsGPSTrackingEnabled()) 
    { 
     longitude = Double.valueOf(gps.getLongitude()).toString(); 
     latitude = Double.valueOf(gps.getLatitude()).toString(); 
    } 

    deviceID = telephonyManager.getDeviceId(); 

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, (float) 0.0, 
      this); 
} 

Questo è il punto in cui ottengo il rilevamento.

@Override 
public void onLocationChanged(Location currentLocation) 
{ 
    float speed = 0; 
    float speed_mph = 0; 

    if (previousLocation != null) 
    { 
     float distance = currentLocation.distanceTo(previousLocation); 

     // time taken (in seconds) 
     float timeTaken = ((currentLocation.getTime() - previousLocation 
       .getTime())/1000); 

     // calculate speed 
     if (timeTaken > 0) 
     { 
      speed = getAverageSpeed(distance, timeTaken); 
      speed_mph = (float) (getAverageSpeed(distance, timeTaken)/1.6); 
     } 

     if (speed >= 0) 
     { 
      info_text.setVisibility(View.VISIBLE); 
      info_text_mph.setVisibility(View.VISIBLE); 

      DecimalFormat df = new DecimalFormat("#.#"); 
      info_text.setText("Speed: " + df.format(speed) + " " + "km/h"); 
      info_text_mph.setText(" Speed: " + df.format(speed_mph) + " " 
        + "mph"); 

      if (speed >= 10 && lm.getProvider(LocationManager.GPS_PROVIDER).supportsBearing()) 
      { 
       float degree = currentLocation.getBearing(); 

       direction_text.setVisibility(View.VISIBLE); 

       Log.i(TAG, String.valueOf(degree)); 

       if (degree == 0 && degree < 45 || degree >= 315 
         && degree == 360) 
       { 
        direction_text.setText("You are: Northbound"); 
       } 

       if (degree >= 45 && degree < 90) 
       { 
        direction_text.setText("You are: NorthEastbound"); 
       } 

       if (degree >= 90 && degree < 135) 
       { 
        direction_text.setText("You are: Eastbound"); 
       } 

       if (degree >= 135 && degree < 180) 
       { 
        direction_text.setText("You are: SouthEastbound"); 
       } 

       if (degree >= 180 && degree < 225) 
       { 
        direction_text.setText("You are: SouthWestbound"); 
       } 

       if (degree >= 225 && degree < 270) 
       { 
        direction_text.setText("You are: Westbound"); 
       } 

       if (degree >= 270 && degree < 315) 
       { 
        direction_text.setText("You are: NorthWestbound"); 
       } 

      } 

     } 
    } 
    previousLocation = currentLocation; 

} 

Grazie mille!

risposta

2

getBearing() restituirà 0 se si ottengono i dati utilizzando LocationManager.NETWORK_PROVIDER perché il segnale/precisione è troppo debole. Prova a impostare il provider GPS sul GPS e assicurati di testarlo all'esterno (il GPS non funziona in interni o nel mezzo di edifici molto alti a causa dei satelliti che non hanno comunicazione diretta)

Per garantire che il provider che hai scelto supporti getBearing () è possibile utilizzare il metodo da LocationProvider denominato supportsBearing() che restituisce true se il provider scelto supporta la chiamata getBearing().

Infine assicurarsi di avere le ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION autorizzazioni in vostro AndroidManifest.xml

codice secondo i miei suggerimenti sarebbe qualcosa di simile:

LocationManager mlocManager = 

(LocationManager)getSystemService(Context.LOCATION_SERVICE); 

LocationListener mlocListener = new MyLocationListener(); 


mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 

risorse: http://developer.android.com/reference/android/location/LocationManager.html http://developer.android.com/reference/android/location/LocationProvider.html http://www.firstdroid.com/2010/04/29/android-development-using-gps-to-get-current-location-2/

AGGIORNAMENTO: La risposta è stata che le due poi I nts che venivano usati per calcolare in getBearing() erano troppo vicini e quindi davano un risultato inaccurato. Per correggere ciò, afferrare manualmente due punti GPS e utilizzare il rilevamento() per vedere un risultato più accurato.

+0

Grazie per il vostro feedback e mi scuso per aver dimenticato di menzionare nel mio post che sto utilizzando il provider GPS. Aggiornerò il mio codice – user3171597

+0

E hai tentato l'uso di getBearing() mentre fuori e in un luogo lontano da edifici alti o altri oggetti che potrebbero impedirti di comunicare via satellite? –

+0

Sì, l'ho fatto. Ho provato a provare questa funzione mentre guidavo. Sebbene la velocità sia abbastanza accurata (5-10 km di dislivello), il getBearing() restituisce sempre 0, che restituisce sempre "Sei: Northbound" indipendentemente dalla direzione in cui vado. – user3171597