2013-07-27 15 views
6

Sono nuovo alla programmazione Android e volevo iniziare creando un'applicazione molto semplice che visualizza la latitudine e la longitudine della posizione corrente sullo schermo.LocationClient getLastLocation() restituisce null

Sto sviluppando per il mio Samsung Galaxy S3 e ho letto che è necessario kickstart the phone to return the GPS.

Ho provato a farlo nel metodo onConnected() con la chiamata al metodo requestLocationUpdates() sul LocationManager. Tuttavia, trovo che LocationClient stia ancora restituendo una posizione null.

Qualcuno può dirmi cosa sto facendo male?

Ecco la mia 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(); 
    } 

} 

My Android manifesti si presenta così:

<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> 

Quando si esegue il debugger trovo che mCurrentLocation è nullo dopo la chiamata a mLocationClient.getLastLocation().

Sarei molto grato per qualsiasi aiuto!

risposta

8

mLocationClient.getLastLocation(); potrebbe restituire null se non si dispone dell'ultima posizione salvata dal dispositivo. Se leggi il suo documentation, dice;

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

anche all'interno del metodo onLocationChanged si potrebbe desiderare di impostare la posizione per l'ultima posizione, quando la tua posizione viene cambiato.

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

Era esattamente così: non avevo salvato l'ultima posizione. Ho ricevuto un S3 sostitutivo l'altro giorno e ho completamente dimenticato di non aver usato i servizi di localizzazione. Un clic su Google Maps per configurare il GPS e sta funzionando bene ora :). Grazie! –

+0

Felice che abbia funzionato per te :) –

+0

L'errore ottenuto non può convertire il client di posizione in posizione .... –

Problemi correlati