Die Android LocationClient-Klasse ist veraltet, wird jedoch in der Dokumentation verwendet

149

Wenn wir die Dokumentation von durchgehen LocationClient, können wir sehen, dass die Klasse veraltet ist.

Die veraltete Klasse wird jedoch in der Dokumentation verwendet, um den aktuellen Speicherort abzurufen .

Ich denke, das ist ein bisschen irreführend oder schaue ich mir falsche Dokumentationen an?

George Mathew K.
quelle
6
Wie immer lehnen sie apis ab, aktualisieren jedoch nicht gleichzeitig die Dokumente. Sie müssen warten, bis die Dokumente aktualisiert sind, oder versuchen, ein funktionierendes Beispiel zu finden
Imanol
1
@ GeorgeMathewK könnten Sie bitte die richtige Antwort markieren;)
Diego Palomar

Antworten:

271

Wieder hat Google eine neue API veröffentlicht, aber die Dokumentation wurde nicht aktualisiert: $ Nachdem ich einige Zeit damit verbracht habe, herauszufinden, wie es funktioniert, habe ich sie erhalten. Hier finden Sie ein vollständiges Beispiel mit der neuen / neuesten Location Service-API ... Viel Spaß Entwicklung :)

import android.location.Location;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;

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

    private final String TAG = "MyAwesomeApp";

    private TextView mLocationView;

    private GoogleApiClient mGoogleApiClient;

    private LocationRequest mLocationRequest;

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

        mLocationView = new TextView(this);

        setContentView(mLocationView);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }

    @Override
    protected void onStart() {
        super.onStart();
        // Connect the client.
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        // Disconnecting the client invalidates it.
        mGoogleApiClient.disconnect();
        super.onStop();
    }

    @Override
    public void onConnected(Bundle bundle) {

        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(1000); // Update location every second

        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "GoogleApiClient connection has been suspend");
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(TAG, "GoogleApiClient connection has failed");
    }

    @Override
    public void onLocationChanged(Location location) {
        mLocationView.setText("Location received: " + location.toString());
    }
}

und vergessen Sie nicht, diese Berechtigungen zu Ihrer AndroidManifest.xml-Datei hinzuzufügen:

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

Hinweis: Wenn Sie nur den letzten Speicherort LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient)abrufen müssen (ohne Aktualisierungen), können Sie OnConnected verwenden

Diego Palomar
quelle
3
Gibt es ein ähnliches Codebeispiel für die Verwendung der LocationServices.GeofencingAPI?
InquisitorJax
1
Gute Antwort. Füge es einfach mit einigen alten Komponenten / Sachen zusammen und alles funktioniert wie ein Zauber.
MiguelHincapieC
2
Beachten Sie, dass Sie LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);OnConnected
Stevie Kideckel
1
Wie würden Sie eine laufende Standortanfrage stoppen?
Ersen Osman
5
FusedLocationApi ist veraltet
22

Einige der Dokumentationen sind in Google alt (einige Beispiele, die Sie erwähnt haben, verwenden immer noch die veralteten LocationClient). Sie müssen den neuen GoogleApiClient wie in den Beispielen für Standortdienste beschrieben verwenden:

private GoogleApiClient mGoogleApiClient;

  mGoogleApiClient = new GoogleApiClient.Builder(context)
     .addApi(LocationServices.API)
     .addConnectionCallbacks(this)
     .addOnConnectionFailedListener(this)
     .build()

und wenn der neue Client verbunden ist, können Sie die fusionierte Standort-API beispielsweise wie folgt verwenden:

LocationServices.FusedLocationApi.requestLocationUpdates(theNewClient, 
    locationRequest, locationListener);
paularius
quelle
Kannst du mir sagen, wie ich Längen- und Breitengrade bekomme?
2
FusedLocationApi ist veraltet
Furqan
4

Es sieht so aus, als ob dies im Entwicklerblog behandelt wurde . Für LocationClient würden Sie dies in Verbindung mit LocationServices verwenden, das uns dann zu GeofencingApi führt .

Sofi Software LLC
quelle
6
Sechs Monate später nach der Veröffentlichung dieser neuen Google Play-API wurde die Dokumentation noch nicht aktualisiert.
AxeEffect
1
Es sieht auch so aus, als ob die offizielle LocationProvider-App von Google immer noch den LocationClient verwendet, der in diesem Paket nicht mehr vorhanden ist. Import com.google.android.gms.location.LocationClient;
Simon
3

LocationClient wird entfernt. GoogleApiClient ist eine API, die für Standort-APIs von Google Play-Diensten verwendet wird.

Der Beispielcode für die gängigen Szenarien ist hier und die Schulungskurse wurden aktualisiert, weitere folgen in Kürze.

PaulR
quelle
0

Gemäß dem Dokumentationsaktualisierungscode ..

package iwannado.com.myapplicationforsha1key;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Geocoder;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.identity.intents.Address;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.util.List;

public class MapWithMapViewActivity extends AppCompatActivity implements OnMapReadyCallback,
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
    private static final String TAG = MapWithMapViewActivity.class.getCanonicalName();


    private GoogleMap mMap = null;
    private MapView mMapView = null;

    private EditText loatcationEditText = null;

    private GoogleApiClient mGoogleApiClient = null;
    private Location mLocationRequest = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_with_map_view);
        loatcationEditText = (EditText) findViewById(R.id.loatcation_edit_text);
        mMapView = (MapView) findViewById(R.id.mapView);
        /*
        * The method is used to create mapView
        * */
        mMapView.onCreate(savedInstanceState);
        /*
        *The method Return Google map
        * */
        mMapView.getMapAsync(this);

        gotoCurrentLoactionGooglePlayService();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
    }


    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mMapView.onLowMemory();
    }

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

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

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;



    }



    private void gotoCurrentLoactionGooglePlayService() {
        /*working with new google api for laction..
http://stackoverflow.com/a/25173057
* */
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }



    @Override
    public void onConnected(@Nullable Bundle bundle) {
/*
* Follow this documentation.. https://developer.android.com/training/location/retrieve-current.html
*
* Please add Runtime permission here for android 6
* */
        mLocationRequest = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLocationRequest != null) {

           LatLng latLng = new LatLng(mLocationRequest.getLatitude(),mLocationRequest.getLongitude());
        mMap.addMarker(new MarkerOptions().position(latLng).title("Programmatically Current Loaction"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            Toast.makeText(this,"getLatitude() = "+String.valueOf(mLocationRequest.getLatitude())+"\n getLongitude() = "+String.valueOf(mLocationRequest.getLongitude()),Toast.LENGTH_LONG).show();

        }
    }


    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "GoogleApiClient connection has been suspend");
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.i(TAG, "GoogleApiClient connection has failed");
    }

    @Override
    public void onLocationChanged(Location location) {


        Toast.makeText(this,"Location received: " + location.toString(),Toast.LENGTH_LONG).show();

    }
}
Muhammad Waleed
quelle
0

Sie fügen dies einfach in Ihren Code ein.

private FusedLocationProviderClient mFusedLocationClient;
private Location mLastLocation;

 oncreate(){
  .
  .
  FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
   if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    mFusedLocationClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            mLastLocation =location;
            if (mLastLocation!= null) {
                LogUtils.logE(TAG, "Lat: " + mLastLocation.getLatitude() + "Long: " + mLastLocation.getLongitude());
            }

        }
    });
  .
  .
  }

Gemäß dem Dokumentationsaktualisierungscode ..

Saurabh Gaddelpalliwar
quelle