Search code examples
androidoncreatelocationlistener

Fetch Location when Activity Loads(in onCreate)


I tried to use an locationlistener which gets initialized in the onCreate function of my MainActivity. Within that function the location also must be asked, but while debugging i found out, that the listener starts to give coordinates after the function ran through. Waiting also did not worked.

How can i achieve, to get the location while it the activity gets created or how can i manage to make a change to the activities view throught a thread?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getSupportActionBar().hide();

    if(data.gB_GPS_searched == false) {
        data.gB_GPS_searched = true;
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        data.locationListener = new GPS();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, data.locationListener);
    }
    data.set_pier("Bodenwerder");

    data.set_pier(data.get_closest_pier());
    String cityname = data.get_pier_name();
    if(cityname != null)
        ((TextView)findViewById(R.id.current_city)).setText(cityname);
}

The Listener Basically looks like that.

public class GPS implements android.location.LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        if(data.get_gps) {
            try {
                data.Latitute = ((Double)(location.getLatitude()*100)).intValue();
                data.Longitute = ((Double)(location.getLongitude()*100)).intValue();
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
...
}

The data class i am using is for saving and transfering received ... data

public class data {
    public static GPS locationListener;
    public static int Latitute = 0;
    public static int Longitute = 0;
    public static boolean gB_GPS_searched = false;
    private static Map<String,int[]> coordinates = new HashMap<String,int[]>();
    private static int gI_current_city = -1;
    private static List<String> g_piernames = new ArrayList<>();

    public static void set_pier(String pS_piername)
    {
        for(int i = 0; i < g_piernames.size(); i++)
            if(g_piernames.get(i).equals(pS_piername))
            {
                gI_current_city = i;
                i = g_piernames.size();
            }
    }

    public static String get_pier_name()
    {
        return g_piernames.get(gI_current_city);
    }

    public static String get_closest_pier()
    {
        String cityname = "";
        int x = -1;
        int y = -1;

        for (Object key : coordinates.keySet().toArray() ) {
            if(x == -1)
            {
                x = coordinates.get(key.toString())[0];
                y = coordinates.get(key.toString())[1];
                cityname = key.toString();
            }else{
                if(pyth(Math.abs(Latitute-x),Math.abs(Longitute-y)) > pyth(Math.abs(Latitute-coordinates.get(key.toString())[0]),Math.abs(Longitute-coordinates.get(key.toString())[1])))
                {
                    x = coordinates.get(key.toString())[0];
                    y = coordinates.get(key.toString())[1];
                    cityname = key.toString();
                }
            }
        }
        return cityname;
    }

    private static int pyth(int a, int b)
    {
        return ((Double)Math.sqrt(a*a+b*b)).intValue();
    }
}

Solution

  • I'd recommend using PrivacyStreams library to get locations.

    1. Add the following two lines to dependencies in the app/build.gradle file:

      dependencies {
          compile 'com.github.privacystreams:privacystreams-core:0.1.3'
          compile 'com.google.android.gms:play-services-location:10.2.1'
      }
      
    2. Add location permission to AndroidManifest.xml:

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      
    3. In your onCreate method:

      Globals.LocationConfig.useGoogleService = true;
      UQI uqi = new UQI(this);
      uqi.getData(Geolocation.asUpdates(Geolocation.LEVEL_EXACT), Purpose.UTILITY("<your purpose of getting location>"))
          .forEach(Geolocation.LAT_LON, new Callback<LatLon>() {
               protected void onInput(LatLon latLon) {
                   data.Latitute = ((Double) (latLon.getLatitude() * 100)).intValue();
                   data.Longitute = ((Double) (latLon.getLongitude() * 100)).intValue();
                   // Do something with the coordinates
               }
           });