У меня есть простой класс, чтобы получить текущее местоположение пользователя, с которым он работал без проблем.
после добавления новой функции, прежде чем я начал получать текущее местоположение пользователя, чтобы проверить, открыт ли GPS илинет, если он не открылся, он приводит пользователя к файлу настроек, чтобы открыть GPS, а затем начинает брать его местоположение, сейчас я жду очень долго, и местоположение не появляется.вот код, который я использую для получения текущего местоположения.
SingleShotLocationProvider
public class SingleShotLocationProvider {
public static interface LocationCallback {
public void onNewLocationAvailable(GPSCoordinates location);
}
public static boolean GPSOpen = false;
public static boolean NetworkOpen = false;
// calls back to calling thread, note this is for low grain: if you want higher precision, swap the
// contents of the else and if. Also be sure to check gps permission/settings are allowed.
// call usually takes <10ms
public static void requestSingleUpdate(final Context context, final LocationCallback callback) {
final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
NetworkOpen = isNetworkEnabled;
if (isNetworkEnabled) {
Log.i("NETWORK_OPEN", "YES NETWORK Open");
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
locationManager.requestSingleUpdate(criteria, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude()));
}
@Override public void onStatusChanged(String provider, int status, Bundle extras) { }
@Override public void onProviderEnabled(String provider) { }
@Override public void onProviderDisabled(String provider) { }
}, null);
} else {
boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
GPSOpen = isGPSEnabled;
if (isGPSEnabled) {
Log.i("GPS_OPEN", "YES GPS Opened");
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
locationManager.requestSingleUpdate(criteria, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude()));
}
@Override public void onStatusChanged(String provider, int status, Bundle extras) { }
@Override public void onProviderEnabled(String provider) { }
@Override public void onProviderDisabled(String provider) { }
}, null);
}
else {
Toast.makeText(context, "Please Open GPS and retry", Toast.LENGTH_LONG).show();
MainWindow w = (MainWindow)context;
w.DisableTheProgressGPSClosed(); // i have a simple progress bar wait until the app get the location then it GONE
}
}
}
// consider returning Location instead of this dummy wrapper class
public static class GPSCoordinates {
public float longitude = -1;
public float latitude = -1;
public GPSCoordinates(float theLatitude, float theLongitude) {
longitude = theLongitude;
latitude = theLatitude;
}
public GPSCoordinates(double theLatitude, double theLongitude) {
longitude = (float) theLongitude;
latitude = (float) theLatitude;
}
}
}
вот функция, которую я использую, чтобы проверить, открыт GPS или нет.
public boolean turnGPSOn()
{
LocationManager L = (LocationManager) getSystemService(LOCATION_SERVICE);
if (!L.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
Toast.makeText(this, "Please open GPS", Toast.LENGTH_LONG).show();
Intent I = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(I);
return true;
}
return false;
}
вот какЯ использую его, когда пользователь нажимает кнопку.
public void GetLocation() {
if (turnGPSOn()) {
return;
}
Log.i("Process_GPS_DATA", "Done process now GPS");
progressBar.setVisibility(View.VISIBLE);
foo(this);
}
Функция foo, которая вызывает здесь класс GPS.
public void foo(final Context context) {
// when you need location
// if inside activity context = this;
SingleShotLocationProvider.requestSingleUpdate(context,
new SingleShotLocationProvider.LocationCallback() {
@Override public void onNewLocationAvailable(SingleShotLocationProvider.GPSCoordinates location) {
Log.i("Location", "my location is " + location.latitude + "," + location.longitude);
String BaseLocation = "https://www.google.com/maps/?q=" + location.latitude + "," + location.longitude + "";
StartSendRequest(location.longitude, location.latitude, BaseLocation);
Log.i("Google_URL", BaseLocation);
}
});
}
проблема в том, что все работает нормально, но я долго жду ине отображается местоположение, я не знаю, почему эта проблема, когда я делаю тест, я закрываю Android GPS, а затем сделать тест, местоположение не предоставляется, я тестирую тот же класс, прежде чем добавить проверить часть, и она работала нормально.
когдая тестирую в эмуляторе с уже открытым GPS, он работает и дает мне местоположение, когда я закрываю GPS, а затем проверяю снова, что он не работает, и я жду долгое время и ничего не показываю, так что я сделал не так.