2013-07-27 3 views
6

Ich bin neu in der Android-Programmierung und wollte mit der Erstellung einer sehr einfachen App beginnen, die den Breiten- und Längengrad des aktuellen Standorts auf dem Bildschirm anzeigt.LocationClient getLastLocation() gibt null zurück

Ich entwickle für mein Samsung Galaxy S3 und lese, dass Sie kickstart the phone to return the GPS benötigen.

Ich habe versucht, dies in der onConnected() Methode mit dem Methodenaufruf requestLocationUpdates() auf dem LocationManager. Ich finde jedoch, dass der LocationClient immer noch einen null Standort zurückgibt.

Kann mir jemand sagen, was ich falsch mache?

Hier ist meine MainActivity:

import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesClient; 
import com.google.android.gms.location.LocationClient; 

public class MainActivity extends FragmentActivity implements 
     GooglePlayServicesClient.ConnectionCallbacks, 
     GooglePlayServicesClient.OnConnectionFailedListener { 

    private LocationClient mLocationClient; 
    private Location mCurrentLocation; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mLocationClient = new LocationClient(this, this, this); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mLocationClient.connect(); 
    } 

    @Override 
    protected void onStop() { 
     mLocationClient.disconnect(); 
     super.onStop(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 
     Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); 
     LocationManager manager = (LocationManager) this 
       .getSystemService(Context.LOCATION_SERVICE); 
     manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, 
       new LocationListener() { 
        @Override 
        public void onStatusChanged(String provider, int status, 
          Bundle extras) { 
        } 

        @Override 
        public void onProviderEnabled(String provider) { 
        } 

        @Override 
        public void onProviderDisabled(String provider) { 
        } 

        @Override 
        public void onLocationChanged(final Location location) { 
        } 
       }); 
     mCurrentLocation = mLocationClient.getLastLocation(); 

     TextView latTextView = (TextView) findViewById(R.id.latitude_text); 
     latTextView.setText(Double.toString(mCurrentLocation.getLatitude())); 

     TextView longTextView = (TextView) findViewById(R.id.longitude_text); 
     longTextView.setText(Double.toString(mCurrentLocation.getLongitude())); 
    } 

    @Override 
    public void onDisconnected() { 
     Toast.makeText(this, "Disconnected. Please re-connect.", 
       Toast.LENGTH_SHORT).show(); 
    } 

} 

Meine Android Manifest sieht wie folgt aus:

<uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 


    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.willigetwet.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Beim Ausführen des Debuggers finde ich, dass mCurrentLocation nach dem Aufruf von mLocationClient.getLastLocation() null ist.

Ich wäre sehr dankbar für jede Hilfe!

Antwort

8

mLocationClient.getLastLocation(); kann Null zurückgeben, wenn Sie keinen letzten vom Gerät gespeicherten Speicherort haben. Wenn Sie seine documentation lesen, heißt es;

It returns the best most recent location currently available. If a location is not available, which should happen very rarely, null will be returned

Auch innerhalb der onLocationChanged Methode, die Sie könnte die Lage auf den neuesten Standort festlegen möchten, wenn Sie Ihre Position geändert wird.

@Override 
public void onLocationChanged(final Location location) { 
     mCurrentLocation = location; 
} 
+0

Das war genau das - ich hatte keinen letzten Speicherort gespeichert. Ich habe neulich einen Ersatz S3 bekommen und komplett vergessen, dass ich die Ortungsdienste nicht benutzt habe. Ein Klick auf Google Maps, um GPS einzurichten und es funktioniert jetzt gut :). Vielen Dank! –

+0

Froh, dass es für Sie gearbeitet hat :) –

+0

Got error can not location client to location konvertieren. –