Я новичок в кодировании Android и написал код для определения местоположения Android-устройства, но не смог. Ничего не изменилось (например, mLastKnownLocation или cityName) после запуска, и никаких исключений. Я уже проверил разрешение и build.gradle. Не могли бы вы дать мне советы по его реализации?
private void getDeviceLocation() {
try {
if (mLocationPermissionGranted) {
Task<Location> locationResult = mFusedLocationProviderClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY,cancellationToken);
//Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>(){
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful()) {
// Obtain the current location of the device
mLastKnownLocation = task.getResult();
String currentOrDefault = "Current";
if (mLastKnownLocation != null) {
Log.d(TAG, "Get current location");
} else {
Log.d(TAG, "Current location is null. Using defaults.");
currentOrDefault = "Default";
// Set current location to the default location
mLastKnownLocation = new Location("");
mLastKnownLocation.setLatitude(mDefaultLocation.latitude);
mLastKnownLocation.setLongitude(mDefaultLocation.longitude);
}
String city = "CorrectCity";
try {
List<Address> address =
geocoder.getFromLocation(mLastKnownLocation.getLatitude(),
mLastKnownLocation.getLongitude(), 1);
if (address.isEmpty())
city = "No_city";
else{
Address target = address.get(0);
if (target.getLocality()!=null)
city = target.getLocality();
else
city = target.getAdminArea();}
} catch (IOException e) {
Log.e("Exception: %s", e.getMessage());
}
cityName = city;
// Show location details on the location TextView
String msg = currentOrDefault + " Location: " +
Double.toString(mLastKnownLocation.getLatitude()) + ", " +
Double.toString(mLastKnownLocation.getLongitude())+ " " +
cityName;
locationTextView.setText(msg);
} else {
Log.d(TAG, "Current location is null. Using defaults.");
Log.e(TAG, "Exception: %s", task.getException());
/*mMap.moveCamera(CameraUpdateFactory
.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
mMap.getUiSettings().setMyLocationButtonEnabled(false);*/
}
}
});
}
} catch (SecurityException e) {
Log.e("Exception: %s", e.getMessage());
cityName = "ErrorCity";
}
}
}




Вы можете получить свое последнее известное местоположение, используя приведенный ниже код.
FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(getContext());
fusedLocationClient.getLastLocation().addOnSuccessListener(location -> {
if (location != null) {
// your last known location is stored in `location`
}
});
обратитесь: https://developer.android.com/training/location/retrieve-current
Использование Location Manager
LocationManager manager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
mMap.clear();
LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude());
mMap.addMarker(new MarkerOptions().position(userLocation).title("Me"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15));
}
@Override
public void onProviderEnabled(@NonNull String provider) {
}
@Override
public void onProviderDisabled(@NonNull String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
Вы пытались изменить местоположение вашего устройства? И где я использовал getCurrentLocation?
В случае, если я использую эмулятор, я изменил местоположение с «Расширенное управление» -> «Местоположение» -> «Единая точка», но getLastLocation() не работает для этого изменения, в то время как перед изменением он получает старое местоположение. Как вы можете видеть строку под getCurrentLocation() в моем коде, я пробовал.
код внутри MapFragment?
Я просто хочу показать местоположение в текстовом виде, а не на карте. Должен ли я реализовать MapFragment в этом случае.
Кстати, я обнаружил, что мой onCompleteListener, похоже, пропущен. Когда я отлаживаю и принудительно запускаю код внутри слушателя, он работает отлично.
Я обновил ответ, попробуйте использовать диспетчер местоположений
@sern, если это ответ на ваш вопрос, вы можете принять этот ответ
Извините за поздний ответ! Я пробовал LocationManager, но все равно не работает. Однако я обнаружил, что мой код Task<Location> locationResult = mFusedLocationProviderClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY, cancellationTokenSource.getToken()); успешно работает в другом проекте, но в этом проекте я могу применить только getLastLocation().
Поэтому я дважды проверил свои настройки (манифест, API и градиент), но до сих пор понятия не имею. Есть ли у вас какие-либо идеи по поводу этой ситуации. Если да, не могли бы вы сказать мне или опубликовать в своем ответе, я приму его немедленно.
Уважаемый сэр, это не работает для меня. Он просто получает старые данные, потому что
getCurrentLocation()пропускается по неизвестной причине.