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!
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
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? –
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