Я пытаюсь получить текущее местоположение пользователя из асинтез. Мое приложение зависит от значений широты и долготы. Я пытаюсь показать ProgressDialog пользователю до тех пор, пока не будет выбрано местоположение.Android GPS местоположение всегда null внутри AsyncTask
Задача: - Значение местоположения всегда равно нулю. Я знаю, что получение местоположения gps требует времени. Но мое значение местоположения равно нулю даже после ожидания. Его всегда null.
Ниже мой код: -
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//some action …
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (id == R.id.action_settings)
{
return true;
}
if(id == R.id.action_location)
{
LocationTask locGetter = new LocationTask(MainActivity.this);
locGetter.execute();
}
return super.onOptionsItemSelected(item);
}
}
Ниже мой AsyncTask
public class LocationTask extends AsyncTask<Void,Void,Void> implements LocationListener
{
private ProgressDialog dialog;
private Activity callingActivity;
LocationManager locationManager;
String provider = LocationManager.GPS_PROVIDER;
public LocationTask(Activity activity)
{
callingActivity = activity;
}
@Override
protected void onPreExecute()
{
dialog= ProgressDialog.show(callingActivity,"Getting Co-ordinates","Please Wait....");
}
@Override
protected Void doInBackground(Void... voids)
{
locationManager = (LocationManager) callingActivity.getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(provider);
showLocation(location);
return null;
}
private void showLocation(Location location)
{
if(location == null)
{
Log.d("Location","Failed to get location");
}
else
{
Log.d("Location","Latitude :- "+location.getLatitude()+" Longitude :- "+location.getLongitude());
}
}
@Override
protected void onPostExecute(Void aVoid)
{
dialog.dismiss();
super.onPostExecute(aVoid);
}
@Override
public void onLocationChanged(Location location)
{
showLocation(location);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
}
UPDATE: -
Как отметил Иван Я изменил мой AsyncTask, чтобы получить место, как ниже: -
@Override
protected Void doInBackground(Void... voids) {
locationManager = (LocationManager) callingActivity.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(provider,0,0,this);
if(locationManager != null) {
Location location = locationManager.getLastKnownLocation(provider);
showLocation(location);
}
return null;
}
Но это исключает исключение «окон утечки» в dialog= ProgressDialog.show(callingActivity,"Getting Co-ordinates","Please Wait....");
внутри метода onPrexecute().
Ваша программа будет нуждаться в явном разрешении пользователя для доступа к координатам GPS. – planetmaker
Я добавил разрешение ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, INTERNET. –