Я посмотрел везде, где возможно, и нашел нада.Уже несколько часов я пытаюсь решить эту проблему, но не повезло.У меня есть функция, которая предназначена для получения моего местоположения один раз через requestLocationUpdates и затем getLastKnownLocation .Теперь вот вещь.Если службы определения местоположения на телефоне отключены, появляется всплывающее окно alertDialog, спрашивающее, хочет ли пользователь активировать его и, если он это делает, переводит его в окно настроек.В случае, если сервисы отключены, и пользователь заходит в окно настроек, активирует их и затем повторяет попытку использования функции, что-то странное происходит.Позже я использую местоположение, которое я отчаянно пытаюсь найти здесь, в следующем упражнении, но это ссылка на нуль, поэтому он вылетает.Если я обычно запускаю приложение, оно вылетает со следующей ошибкой:
Причина: java.lang.NullPointerException: Попытка вызвать виртуальный метод 'float android.location.Location.distanceTo (android.location.Location) 'для ссылки на пустой объект
Если я отлаживаю приложение, оно работает просто отлично.И если я запускаю таймер сна 3000 миллисекунд между requestLocationUpdates и getLastKnownLocation, он иногда работает, а иногда нет.Я ЛЮБЛЮ немного помощи, потому что я просто невежественен.
Я использую AsyncTask, потому что я думал, что это происходит, потому что устройству не удается завершить requestLocationUpdates (), прежде чем оно достигнет getLastKnownLocation (), поэтому я использовал AsyncTaskи .get () так, что он ждет, пока не закончится.
Ниже приведены коды.
Получатель местоположения
ArrayList<ArrayList<String>> teachers = Client.getTeachers();
Location loc;
loc = gpsOps.getLocation();
Intent i = new Intent(getApplicationContext(), teachersScreen.class);
i.putExtra("teachers", teachers);
i.putExtra("location", loc);
startActivity(i);
gpsOps.getLocation
public static Location getLocation()
{
try {
new AsyncGetLocation().execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
List<String> providers = lm.getProviders(true);
Location l = null;
for (int i = providers.size() - 1; i >= 0; i--) {
l = lm.getLastKnownLocation(providers.get(i));
if (l != null) break;
}
return l;
}
requestLocationUpdates
public class AsyncGetLocation extends AsyncTask<Void,Void,Void> {
private ProgressBar dialog = null;
private Location loc = null;
@Override
protected void onPreExecute()
{
}
@SuppressLint("MissingPermission")
@Override
protected Void doInBackground(Void... Void)
{
Log.e("doInBackground", "Entered getLocation");
gpsOps.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0.0f, gpsOps.ls, Looper.getMainLooper());
return null;
}
@Override
protected void onPostExecute(Void aVoid)
{
}
Неправильная последовательность команд
tempLoc = locs.get(teachers.get(x).get(3));
if(loc.distanceTo(tempLoc) <= 30*1000)
rangeFlag = true;
else
rangeFlag = false;