Android getbearing zwraca tylko 0.0. Próbujesz użyć ikony obracania bieżącej lokalizacji
Jest to częściowo rozszerzenie poprzedniego pytania:Programowanie w systemie Android, nakładka na lokalizację mapy: jak zmienić domyślną niebieską kropkę z innym obrazem
Pracowałem nad tym, aby lokalizacja urządzeń była wyświetlana na mapie (łatwa dzięki enablemylocation), ale muszę zastąpić domyślną ikonę (dość łatwo posortowaną), a następnie obrócić ją, aby odpowiadała bieżącemu łożyskowaniu urządzenia - uzyskanemu z GPS, ponieważ musi to być kierunek ruchu, a nie kierunek, w którym stoi telefon.
Używam 'getbearing ()' w ten sam sposób, w jaki pomyślnie korzystałem z 'getlatitude ()' i 'getaltitude ()', ale getbearing zawsze zwraca 0. (Aby upewnić się, że to nie jest kod, który obraca ikona, która była problemem, zmienna dla namiaru jest drukowana w widoku tekstowym, zanim cokolwiek się stanie)
Bardzo dziwną rzeczą jest to, że działa teraz dwukrotnie przez 5 sekund, a następnie powraca do powrotu 0 - więc teoretycznie kod wydaje się poprawny?
Kod następuje.
Z poważaniem
Nacięcie
Główna aktywność:
<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>
}
Moja lokacja
<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>
}