O Android getbearing retorna apenas 0,0. Tentando usar para girar o ícone da localização atual
Isso é em parte uma extensão para uma pergunta anterior:Programação do Android, sobreposição de localização do mapa: como alterar o ponto de localização azul padrão, com outra imagem
Eu tenho trabalhado para obter a localização dos dispositivos para exibir no mapa (fácil com a enililocação), mas eu preciso substituir o ícone padrão (bastante fácil, classificado isso) e depois girá-lo para corresponder ao rolamento do dispositivo atual - adquirido do GPS, como precisa ser direção de movimento, não direção o telefone está enfrentando.
Eu estou usando 'getbearing ()' da mesma maneira que eu tenho usado com sucesso 'getlatitude ()' e 'getaltitude ()', mas getbearing sempre retorna 0. (Para ter certeza de que não era o código que gira o ícone que era o problema a variável para o rolamento é impressa em uma visão de texto antes de qualquer outra coisa acontecer)
A coisa muito peculiar é que ele trabalhou duas vezes agora por 5 segundos, e voltou ao 0 - então, em teoria, o código parece correto?
Código segue.
Atenciosamente
usuario
Atividade 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>
}
mylocationenerener
<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>
}
minha localização
<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>
}