Android getbearing sólo devuelve 0.0. Tratando de usar para rotar el icono de ubicación actual
Esto es en parte una extensión a una pregunta anterior:Programación de Android, mapview locationoverlay: cómo cambiar el punto de ubicación azul predeterminado, con otra imagen
He estado trabajando para que la ubicación de los dispositivos se muestre en el mapa (fácil con la localización de problemas) pero necesito reemplazar el ícono predeterminado (lo suficientemente fácil, lo ordené) y luego girarlo para que se corresponda con el cojinete del dispositivo actual, adquirido del GPS como debe ser la dirección del movimiento, no la dirección hacia la que se enfrenta el teléfono.
Estoy usando 'getbearing ()' de la misma manera que lo he estado usando con éxito 'getlatitude ()' y 'getaltitude ()', pero getbearing siempre devuelve 0. (Para asegurarse de que no fue el código el que hace girar el icono que era el problema, la variable para el rodamiento se imprime en una vista de texto antes de que ocurra algo más)
Lo más peculiar es que ha funcionado dos veces durante los 5 segundos, y luego ha vuelto a devolver 0, ¿por lo que en teoría el código parece correcto?
El código sigue.
Saludos cordiales
Mella
Actividad principal:
<code>package com.nick.kestrel; import android.content.Context; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import com.google.android.maps.MapActivity; import com.google.android.maps.MapView; public class KestrelActivity extends MapActivity { /** Called when the activity is first created. */ static TextView LocationText; MapView mapView; @Override protected boolean isRouteDisplayed() { return false; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Identifies the textview 'locationtext' as the variable LocationText. Planned usage just for debugging LocationText = (TextView)findViewById(R.id.locationtext); //defines the mapview as variable 'mapView' and enables zoom controls mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); /** * Code required to receive gps location. Activates GPS provider, and is set to update only after * at least 10 seconds and a position change of at least 10 metres */ LocationListener locationListener = new MyLocationListener(); //setting up the location manager LocationManager locman = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, (float) 0.01, locationListener); //Adds a current location overlay to the map 'mapView' and turns on the map's compass MyLocation myLocationOverlay = new MyLocation(this, mapView); myLocationOverlay.enableMyLocation(); myLocationOverlay.enableCompass(); mapView.getOverlays().add(myLocationOverlay); mapView.postInvalidate(); } </code>
}
mylocationlistener
<code>package com.nick.kestrel; import android.location.Location; import android.location.LocationListener; import android.os.Bundle; public class MyLocationListener implements LocationListener { private boolean hasbearing; /** * Code to run when the listener receives a new location */ @Override public void onLocationChanged(Location locFromGps) { //Toast.makeText(getApplicationContext(), "Location changed, Lat: "+locFromGps.getLatitude()+" Long: "+ locFromGps.getLongitude(), Toast.LENGTH_SHORT).show(); //LocationText.setText("Your Location: Latitude " +locFromGps.getLatitude() + " Longitude: " +locFromGps.getLongitude()); double dbllatitude = locFromGps.getLatitude(); double dbllongitude = locFromGps.getLongitude(); double dblaltitude = locFromGps.getAltitude(); float bearing = locFromGps.getBearing(); KestrelActivity.LocationText.setText("Your Location: Latitude " + dbllatitude + " Longitude: " +dbllongitude + " Altitude " + dblaltitude + " Bearing: " + bearing); hasbearing = locFromGps.hasBearing(); if (hasbearing = false) { //Toast.makeText(getApplicationContext(), "No bearing", Toast.LENGTH_SHORT).show(); } else { //Toast.makeText(getApplicationContext(), "I HAZ bearing: " + locFromGps.getBearing(), Toast.LENGTH_SHORT).show(); } } @Override public void onProviderDisabled(String provider) { // called when the GPS provider is turned off (user turning off the GPS on the phone) } @Override public void onProviderEnabled(String provider) { // called when the GPS provider is turned on (user turning on the GPS on the phone) } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // called when the status of the GPS provider changes } </code>
}
mi ubicacion
<code>package com.nick.kestrel; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Point; import android.location.Location; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import com.google.android.maps.MyLocationOverlay; public class MyLocation extends MyLocationOverlay { private Context mContext; static float mOrientation; public MyLocation(Context context, MapView mapView) { super(context, mapView); mContext = context; } @Override protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) { // translate the GeoPoint to screen pixels Point screenPts = mapView.getProjection().toPixels(myLocation, null); // create a rotated copy of the marker Bitmap arrowBitmap = BitmapFactory.decodeResource( mContext.getResources(), R.drawable.pin_icon); Matrix matrix = new Matrix(); matrix.postRotate(mOrientation); Bitmap rotatedBmp = Bitmap.createBitmap( arrowBitmap, 0, 0, arrowBitmap.getWidth(), arrowBitmap.getHeight(), matrix, true ); // add the rotated marker to the canvas canvas.drawBitmap( rotatedBmp, screenPts.x - (rotatedBmp.getWidth() / 2), screenPts.y - (rotatedBmp.getHeight() / 2), null ); mapView.postInvalidate(); } public void setOrientation(float newOrientation) { mOrientation = newOrientation; } </code>
}