2015-07-15 3 views
0

Я пытаюсь получить текущее местоположение пользователя из асинтез. Мое приложение зависит от значений широты и долготы. Я пытаюсь показать 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().

+0

Ваша программа будет нуждаться в явном разрешении пользователя для доступа к координатам GPS. – planetmaker

+0

Я добавил разрешение ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, INTERNET. –

ответ

0

Мне кажется, что вы можете пропустить звонок requestLocationUpdates(...).

Пожалуйста, проверьте это related question для лучшего понимания того, что может отсутствовать, так как он уверен, что это не проблема с тем, что он находится внутри AsyncTask, хотя я действительно не вижу необходимости в AsyncTask в вашем сниппет.

+0

: - Согласен ... Я внес изменения в свой код и поставил последний вопрос в вопросе ... но теперь я получаю исключение во время выполнения (windowsleaked) внутри onPreexecute(), где я пытаюсь добавить диалог прогресса –

0

Вы пытались использовать String locationProvider = LocationManager.NETWORK_PROVIDER; , чтобы определить, является ли это проблемой поставщика? Иван упомянул, что вы не получите обновлений, но, насколько я понимаю, вы все еще ищете последнее известное место.

Смежные вопросы