62 votes

LocationClient getLastLocation () return null

Comme les questions de quelqu'un rencontré avant J'ai testé le nexus s(4.0.4 avec google play services) et avd (4.2.2 avec l'api de google), dans les deux cas locationclient de getLastLocation() retourne toujours null.

public class MainActivity extends Activity implements LocationListener,
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {

    private LocationClient mLocationClient;

    private LocationRequest mLocationRequest;
    boolean mUpdatesRequested = false;
    boolean mConnected = false;
    SharedPreferences mPrefs;
    SharedPreferences.Editor mEditor;

    private TextView mText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        mText = (TextView) findViewById(R.id.text);

        mLocationRequest = LocationRequest.create();
        mLocationRequest
                .setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest
                .setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);

        mUpdatesRequested = false;

        mPrefs = getSharedPreferences(LocationUtils.SHARED_PREFERENCES,
                Context.MODE_PRIVATE);
        mEditor = mPrefs.edit();

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

    }
    @Override
    public void onStart() {
        super.onStart();
        /*
         * Connect the client. Don't re-start any requests here; instead, wait
         * for onResume()
         */
        mLocationClient.connect();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // If the app already has a setting for getting location updates, get it
        if (mPrefs.contains(LocationUtils.KEY_UPDATES_REQUESTED)) {
            mUpdatesRequested = mPrefs.getBoolean(
                    LocationUtils.KEY_UPDATES_REQUESTED, false);

            // Otherwise, turn off location updates until requested
        } else {
            mEditor.putBoolean(LocationUtils.KEY_UPDATES_REQUESTED, false);
            mEditor.commit();
        }
    }

    @Override
    public void onStop() {

        // If the client is connected
        if (mLocationClient.isConnected()) {
            stopPeriodicUpdates();
        }

        // After disconnect() is called, the client is considered "dead".
        mLocationClient.disconnect();

        super.onStop();
    }

    @Override
    public void onPause() {

        // Save the current setting for updates
        mEditor.putBoolean(LocationUtils.KEY_UPDATES_REQUESTED,
                mUpdatesRequested);
        mEditor.commit();

        super.onPause();
    }

    @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;
    }
    public void getLocation(View v) {
        // If Google Play Services is available
        if (isGooglePlayServicesAvailable()) {
            if (!mConnected)
                mText.setText("location client is not connected to service yet");
            else {
                // Get the current location
                Location currentLocation = mLocationClient.getLastLocation();
                // Display the current location in the UI
                mText.setText(LocationUtils.getLocationString(currentLocation));
            }
        }
    }

    private boolean isGooglePlayServicesAvailable() {

        // Check that Google Play services is available
        int resultCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(this);

        // If Google Play services is available
        if (ConnectionResult.SUCCESS == resultCode) {
            // In debug mode, log the status
            Log.d(LocationUtils.APPTAG, "google play service is available");

            // Continue
            return true;
            // Google Play services was not available for some reason
        } else {
            // Display an error dialog
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode,
                    this, 0);
            if (dialog != null) {
                Log.e(LocationUtils.APPTAG,
                        "google play service is unavailable");
            }
            return false;
        }
    }

    private void stopPeriodicUpdates() {
        mLocationClient.removeLocationUpdates(this);
        // mConnectionState.setText(R.string.location_updates_stopped);
    }

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
        mConnected = false;
        Log.d(LocationUtils.APPTAG, "connection failed");
    }

    @Override
    public void onConnected(Bundle arg0) {
        mConnected = true;
        Log.d(LocationUtils.APPTAG,
                "location client connected to the location server");

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,
                new android.location.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) {
                    }
                });
        Log.d(LocationUtils.APPTAG, "done trying to get location");

    }

    @Override
    public void onDisconnected() {
        // TODO Auto-generated method stub
        mConnected = false;
        Log.d(LocationUtils.APPTAG,
                "location client disconnected from the location server");
    }

    @Override
    public void onLocationChanged(Location arg0) {
        // TODO Auto-generated method stub

    }

}

la plupart d'entre eux sont venus à partir des exemples donnés par google. Dans le code ci-dessus hava essayé la méthode comme ça:

LocationRequest request = LocationRequest.create();
request.setNumUpdates(1);
mLocationClient.requestLocationUpdates(request, this);

et

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,
                new android.location.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) {
                    }
                });

Dans onConnected() avant d'appeler getLastLocation(), mais pas de chance. Où est l'erreur, Merci d'avance.

55voto

David Points 291

Actuellement, le fournisseur d’emplacement fusionné ne conserve l’emplacement d’arrière-plan que si au moins un client y est connecté. Une fois le premier client connecté, il essaiera immédiatement d’obtenir un emplacement. Si votre activité est le premier client à se connecter et que vous appelez immédiatement getLastLocation () dans onConnected (), le temps imparti au premier emplacement ne sera peut-être pas suffisant.

22voto

Saran Points 1186

J'ai eu le même problème en suivant les instructions du tutoriel . Au téléphone cela a fonctionné et sur l'émulateur (Genymotion) cela n'a pas fonctionné.

Solution

Dans votre AndroidManifest.xml, changez ceci:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 

pour ça:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 

... et vous obtenez l'emplacement immédiatement. Pas besoin de changer votre code (pour écouter les mises à jour d'emplacement).

20voto

Tim Hong Points 363

Le problème peut aussi être causé par votre appareil ne possède pas de "Wi-Fi et réseau mobile "emplacement" est activé.

LocationClient (le fusionné fournisseur d'emplacement) utilise à la fois le GPS et le WiFi. Le GPS prend du temps pour trouver votre position, alors que le wifi est beaucoup plus rapide. Toutefois, si l'un de ces 2 services sont connectés, le retour d'appel de la méthode onConnected sera appelée. Et si vous essayez d'appeler LocationClient.getLastLocation() dans le onConnected méthode immédiatement, il est plus probable que vous obtiendrez la valeur null si le wifi de votre service de localisation est désactivé. C'est simplement parce que le GPS est tout simplement pas assez rapide.

Pour résoudre le problème par vous-même localement, activez l'option "Wi-Fi gratuite et mobile à l'emplacement réseau". Vous pouvez le faire en allant dans "Paramètres > Personnel > accès aux données de Localisation > Wi-Fi et réseau mobile "emplacement".

Toutefois, si vous voulez résoudre le problème pour les utilisateurs de votre application, vous feriez mieux de vérifier si getLastLocation() renvoie la valeur null. Si elle le fait, les inviter à l'utilisateur d'activer le service à l'instar de google map ne.

Espérons que cela aide.

7voto

droidster Points 450

Je faisais face à un problème similaire.

Appelez mLocationClient.getLastLocation () dans onConnected ou après l’établissement de la connexion aux services Google Play. Si vous appelez cette méthode avant que l'emplacement Client ne soit connecté, l'emplacement renvoyé serait null.

Vous pouvez vérifier si le client d'emplacement est connecté par mLocationClient.isConnected ().

J'espère que cela t'aides.

5voto

Pitel Points 157

Vous devez vérifier si l'utilisateur a activé la localisation via Wi-Fi / GSM ou GPS. S'il n'y a pas de fournisseur d'emplacement disponible, vous obtenez null .

Ce code affiche l'écran avec les paramètres de localisation:

 startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X