Ich konnte nicht herausfinden, warum LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this); “FusedLocationApi” ist durchgestrichen und zeigt darauf, dass es veraltet ist. Klicken Sie hier, um das Bild anzuzeigen
import android.location.Location;
import android.location.LocationListener;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MaintainerMapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{
private GoogleMap mMap;
GoogleApiClient mGoogleApiClient;
Location mLastLocaton;
LocationRequest mLocationRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maintainer_map2);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
@Override
public void onLocationChanged(Location location) {
}
@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 onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
Wenn es veraltet ist, gibt es eine Zeile dazu. Bitte überprüfen Sie, ob ich diese LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this) verwende.
– Omar Hayat
29. September 2017 um 4:28 Uhr
@OmarHayat FusedLocationApi ist durchgestrichen
– vvvv
29. September 2017 um 4:37 Uhr
Überprüfen Sie Ihre Abhängigkeiten, die ich mit dieser Kompilierung ‘com.google.android.gms:play-services-location:9.4.0’ kompiliere.
– Omar Hayat
29. September 2017 um 4:37 Uhr
Sie verwenden dies in der oncreate-Methode mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();
– Omar Hayat
29. September 2017 um 4:40 Uhr
@OmarHayat Ich habe Compiler ‘com.google.android.gms:play-services-location:11.4.0’ verwendet und nachdem ich zu 9.4.0 gewechselt habe, wurde das Problem behoben. Warum wurde es nach dem Ändern der Nummer behoben?
– vvvv
29. September 2017 um 4:46 Uhr
Somesh Kumar
Ursprüngliche Antwort
Dies geschieht, weil FusedLocationProviderApi in einer neueren Version der Google Play-Dienste veraltet. Du kannst es überprüfen hier. Der offizielle Leitfaden schlägt nun die Verwendung vor FusedLocationProviderClient. Sie finden die ausführliche Anleitung hier.
für zB drinnen onCreate() oder onViewCreated() ein … kreieren FusedLocationProviderClient Beispiel
Kotlin
val fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext())
und für die Abfrage des letzten bekannten Standorts genügt ein Anruf
fusedLocationClient.getLastLocation().addOnSuccessListener(requireActivity(), location -> {
if (location != null) {
// Logic to handle location object
} else {
// Handle null case or Request periodic location update https://developer.android.com/training/location/receive-location-updates
}
});
Einfach, nicht wahr?
Wichtiges Update (24. Oktober 2017):
Gestern hat Google seine offizielle Entwicklerseite mit aktualisiert eine Warnung das sagt
Bitte verwenden Sie weiterhin die FusedLocationProviderApi-Klasse und migrieren Sie nicht zur FusedLocationProviderClient-Klasse, bis Version 12.0.0 der Google Play-Dienste verfügbar ist, die voraussichtlich Anfang 2018 ausgeliefert wird. Die Verwendung von FusedLocationProviderClient vor Version 12.0.0 führt zum Absturz der Client-App Google Play-Dienste werden auf dem Gerät aktualisiert. Wir entschuldigen uns für etwaige Unannehmlichkeiten.
Ich denke also, wir sollten die veralteten weiterhin verwenden LocationServices.FusedLocationApi bis Google das Problem behebt.
Letztes Update (21. November 2017):
Die Warnung ist jetzt weg.Google Play-Dienste 11.6 6. November 2017, Versionshinweis sagt: Ich denke, Play Services stürzt nicht ab, wenn es sich im Hintergrund aktualisiert. So können wir neue verwenden FusedLocationProviderClient jetzt.
macht getLastLocation() das, was LocationServices.FusedLocationApi.requestLocationUpdates() getan hat? Was bis jetzt so seltsam ist, ist die Dokumentation, die immer noch auf diesen alten Weg hinweist. Es ist verwirrend. developer.android.com/training/location/…
– Juan Mendez
3. November 2017 um 17:32 Uhr
@JuanMendez Ich stimme zu. Sie müssen daran arbeiten, die richtigen Beispiele auf dem neuesten Stand zu halten. übrigens getLastLocation() Geben Sie nur den letzten bekannten Standort des Geräts zurück. Sie können eine Standortaktualisierung mit neu anfordern requestLocationUpdates(LocationRequest request, PendingIntent callbackIntent) Methode.
– Somesh Kumar
6. November 2017 um 5:31 Uhr
@Fraid Ja, die Warnung ist weg … und der von Ihnen bereitgestellte Link besagt auch, dass die neue Version der Google Play-Dienste nicht abstürzt, wenn der Benutzer die App aktualisiert. Ich denke, ich sollte meine Antwort jetzt aktualisieren.
– Somesh Kumar
14. November 2017 um 5:13 Uhr
Und was einfach? Dein Beispiel hat das nicht requestLocationUpdateswas ist schwierig mit mFusedLocationClient.getLastLocation()? geben Sie besser ein Beispiel mit requestLocationUpdates
– Benutzer924
26. Oktober 2018 um 7:04 Uhr
Ramapati Maurya
// Better to use GoogleApiClient to show device location. I am using this way in my aap.
public class SuccessFragment extends Fragment{
private TextView txtLatitude, txtLongitude, txtAddress;
// private AddressResultReceiver mResultReceiver;
// removed here because cause wrong code when implemented and
// its not necessary like the author says
//Define fields for Google API Client
private FusedLocationProviderClient mFusedLocationClient;
private Location lastLocation;
private LocationRequest locationRequest;
private LocationCallback mLocationCallback;
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 14;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_location, container, false);
txtLatitude = (TextView) view.findViewById(R.id.txtLatitude);
txtLongitude = (TextView) view.findViewById(R.id.txtLongitude);
txtAddress = (TextView) view.findViewById(R.id.txtAddress);
// mResultReceiver = new AddressResultReceiver(null);
// cemented as above explained
try {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getActivity());
mFusedLocationClient.getLastLocation()
.addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
// Logic to handle location object
txtLatitude.setText(String.valueOf(location.getLatitude()));
txtLongitude.setText(String.valueOf(location.getLongitude()));
if (mResultReceiver != null)
txtAddress.setText(mResultReceiver.getAddress());
}
}
});
locationRequest = LocationRequest.create();
locationRequest.setInterval(5000);
locationRequest.setFastestInterval(1000);
if (txtAddress.getText().toString().equals(""))
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
else
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
for (Location location : locationResult.getLocations()) {
// Update UI with location data
txtLatitude.setText(String.valueOf(location.getLatitude()));
txtLongitude.setText(String.valueOf(location.getLongitude()));
}
}
;
};
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return view;
}
@Override
public void onStart() {
super.onStart();
if (!checkPermissions()) {
startLocationUpdates();
requestPermissions();
} else {
getLastLocation();
startLocationUpdates();
}
}
@Override
public void onPause() {
stopLocationUpdates();
super.onPause();
}
/**
* Return the current state of the permissions needed.
*/
private boolean checkPermissions() {
int permissionState = ActivityCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_COARSE_LOCATION);
return permissionState == PackageManager.PERMISSION_GRANTED;
}
private void startLocationPermissionRequest() {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
REQUEST_PERMISSIONS_REQUEST_CODE);
}
private void requestPermissions() {
boolean shouldProvideRationale =
ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.ACCESS_COARSE_LOCATION);
// Provide an additional rationale to the user. This would happen if the user denied the
// request previously, but didn't check the "Don't ask again" checkbox.
if (shouldProvideRationale) {
Log.i(TAG, "Displaying permission rationale to provide additional context.");
showSnackbar(R.string.permission_rationale, android.R.string.ok,
new View.OnClickListener() {
@Override
public void onClick(View view) {
// Request permission
startLocationPermissionRequest();
}
});
} else {
Log.i(TAG, "Requesting permission");
// Request permission. It's possible this can be auto answered if device policy
// sets the permission in a given state or the user denied the permission
// previously and checked "Never ask again".
startLocationPermissionRequest();
}
}
/**
* Callback received when a permissions request has been completed.
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
Log.i(TAG, "onRequestPermissionResult");
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
// If user interaction was interrupted, the permission request is cancelled and you
// receive empty arrays.
Log.i(TAG, "User interaction was cancelled.");
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted.
getLastLocation();
} else {
// Permission denied.
// Notify the user via a SnackBar that they have rejected a core permission for the
// app, which makes the Activity useless. In a real app, core permissions would
// typically be best requested during a welcome-screen flow.
// Additionally, it is important to remember that a permission might have been
// rejected without asking the user for permission (device policy or "Never ask
// again" prompts). Therefore, a user interface affordance is typically implemented
// when permissions are denied. Otherwise, your app could appear unresponsive to
// touches or interactions which have required permissions.
showSnackbar(R.string.permission_denied_explanation, R.string.settings,
new View.OnClickListener() {
@Override
public void onClick(View view) {
// Build intent that displays the App settings screen.
Intent intent = new Intent();
intent.setAction(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package",
BuildConfig.APPLICATION_ID, null);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
}
}
}
/**
* Provides a simple way of getting a device's location and is well suited for
* applications that do not require a fine-grained location and that do not need location
* updates. Gets the best and most recent location currently available, which may be null
* in rare cases when a location is not available.
* <p>
* Note: this method should be called after location permission has been granted.
*/
@SuppressWarnings("MissingPermission")
private void getLastLocation() {
mFusedLocationClient.getLastLocation()
.addOnCompleteListener(getActivity(), new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful() && task.getResult() != null) {
lastLocation = task.getResult();
txtLatitude.setText(String.valueOf(lastLocation.getLatitude()));
txtLongitude.setText(String.valueOf(lastLocation.getLongitude()));
} else {
Log.w(TAG, "getLastLocation:exception", task.getException());
showSnackbar(getString(R.string.no_location_detected));
}
}
});
}
private void stopLocationUpdates() {
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
}
private void startLocationUpdates() {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), 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.requestLocationUpdates(locationRequest, mLocationCallback, null);
}
// private void showSnackbar(final String text) {
// if (canvasLayout != null) {
// Snackbar.make(canvasLayout, text, Snackbar.LENGTH_LONG).show();
// }
//}
// this also cause wrong code and as I see it dont is necessary
// because the same method which is really used
private void showSnackbar(final int mainTextStringId, final int actionStringId,
View.OnClickListener listener) {
Snackbar.make(getActivity().findViewById(android.R.id.content),
getString(mainTextStringId),
Snackbar.LENGTH_INDEFINITE)
.setAction(getString(actionStringId), listener).show();
}
}
entferne diese Zeile. Und der Rest des Codes wird für Sie funktionieren
– Ramapati Maurya
15. Mai 2018 um 13:19 Uhr
Standort kann im nächsten Intervall nicht abgerufen werden
– Vishal Yadav
17. Mai 2018 um 6:13 Uhr
@Vishal Ich erhalte Echtzeit-Standort bei jeder Instanz, die Sie benötigen, um die Standortberechtigung sowohl im Manifest als auch im Code zu überprüfen
– Ramapati Maurya
17. Mai 2018 um 10:47 Uhr
Danke für deinen Code. Aber ich habe ein Problem: Wenn ich alle 100 Meter einen Standort benötige und ihn an den Server sende, was soll ich tun? Bitte helfen Sie.
– Pravinsingh Waghela
12. Oktober 2018 um 15:41 Uhr
Verwenden Sie wie folgt: locationRequest =LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(90000) .setSmallestDisplacement(10) .setFastestInterval(10000);
Ja, es ist veraltet!
Hier sind einige Punkte, die Sie bei der Verwendung von new benötigen FusedLocationProviderClient.
Importieren Sie es als Import com.google.android.gms.location.FusedLocationProviderClient; 😅
Ich merke, dass Sie implementieren LocationListener Schnittstelle. In der Methode mFusedLocationClient.requestLocationUpdates() wird jetzt kein LocationListener als Parameter verwendet. Sie können zur Verfügung stellen StandortRückruf. Da dies eine abstrakte Klasse ist, können Sie sie nicht wie LocationListener implementieren. Erstellen Sie eine Rückrufmethode und übergeben Sie sie anstelle von “this”, wie in Google erwähnt führen. importiere es als import com.google.android.gms.location.LocationCallback;
Mit LocationCallback haben Sie onLocationResult() Anstatt von onLocationChanged(). Es kehrt zurück Standortergebnis Objekt anstelle von Location-Objekt. Verwenden Sie LocationResult.getLastLocation(), um den letzten verfügbaren Standort in diesem Ergebnisobjekt abzurufen. Importieren Sie es als import com.google.android.gms.location.LocationResult;
Latief Anwar
Ja, es wurde verworfen. FusedLocationProviderClient ist einfacher als FusedLocationProviderApiWeil FusedLocationProviderApinormalerweise erfordert GoogleApiClient auch, mit dem wir uns verbinden müssen Google Play Service manuell. Wenn Sie zuvor verwendet haben GoogleApiClientjetzt GoogleApiClientwird nicht mehr benötigt (mehr hier).
Um den letzten Standort zu erhalten, können Sie diese Funktion verwenden:
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.tasks.OnCompleteListener;
public class MainActivity extends AppCompatActivity{
//before public class MainActivity extends AppCompatActivity implements LocationListener,...,...
private static final String TAG = "MainActivity";
public static final int MY_PERMISSIONS_REQUEST_FINE_LOCATION = 101;
private FusedLocationProviderClient mFusedLocationClient;
private Location mGetedLocation;
private double currentLat, currentLng;
private void getLastLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_FINE_LOCATION);
}
return;
}
mFusedLocationClient.getLastLocation()
.addOnCompleteListener(this, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful() && task.getResult() != null) {
mGetedLocation = task.getResult();
currentLat = mGetedLocation.getLatitude();
currentLng = mGetedLocation.getLongitude();
//updateUI();
}else{
Log.e(TAG, "no location detected");
Log.w(TAG, "getLastLocation:exception", task.getException());
}
}
});
}
Rasoul Miri
Verwenden Sie getFusedLocationProviderClient anstelle von LocationServices.FusedLocationApi.
FusedLocationProviderClient client =
LocationServices.getFusedLocationProviderClient(this);
// Get the last known location
client.getLastLocation()
.addOnCompleteListener(this, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
// ...
}
});
Wenn es veraltet ist, gibt es eine Zeile dazu. Bitte überprüfen Sie, ob ich diese LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this) verwende.
– Omar Hayat
29. September 2017 um 4:28 Uhr
@OmarHayat FusedLocationApi ist durchgestrichen
– vvvv
29. September 2017 um 4:37 Uhr
Überprüfen Sie Ihre Abhängigkeiten, die ich mit dieser Kompilierung ‘com.google.android.gms:play-services-location:9.4.0’ kompiliere.
– Omar Hayat
29. September 2017 um 4:37 Uhr
Sie verwenden dies in der oncreate-Methode mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();
– Omar Hayat
29. September 2017 um 4:40 Uhr
@OmarHayat Ich habe Compiler ‘com.google.android.gms:play-services-location:11.4.0’ verwendet und nachdem ich zu 9.4.0 gewechselt habe, wurde das Problem behoben. Warum wurde es nach dem Ändern der Nummer behoben?
– vvvv
29. September 2017 um 4:46 Uhr