1

I'm searching for a while now why my Google Map v2 isn't recieving any updates.

I have been reading/looking for several solution, but can't come to a solution. Therefore i don't think that this topic is a duplicated. because the solution i didn't found yet.

The code that i'm using now is from the following topic : https://stackoverflow.com/a/14305851/1364241

public class RouteGroupMapActivity extends SherlockFragmentActivity {

private ActionBar actionbar;
private GoogleMap mMap;
private FollowMeLocationSource followMeLocationSource;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_route_group_map);
    //Activate ActionBar Sherlock
    actionbar = getSupportActionBar();
    actionbar.setHomeButtonEnabled(true);
    actionbar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP|ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_SHOW_TITLE);

    // creates our custom LocationSource and initializes some of its members
    followMeLocationSource = new FollowMeLocationSource();

    //setUpMapIfNeeded();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.activity_home, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this); //Back button
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onPause() {
    /* Disable the my-location layer (this causes our LocationSource to be automatically deactivated.) */
    mMap.setMyLocationEnabled(false);

    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    /* We query for the best Location Provider everytime this fragment is displayed
     * just in case a better provider might have become available since we last displayed it */
    followMeLocationSource.getBestAvailableProvider();

    setUpMapIfNeeded();

    /* Enable the my-location layer (this causes our LocationSource to be automatically activated.)
     * While enabled, the my-location layer continuously draws an indication of a user's
     * current location and bearing, and displays UI controls that allow a user to interact
     * with their location (for example, to enable or disable camera tracking of their location and bearing).*/
    mMap.setMyLocationEnabled(true);
}

/**
 * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
 * installed) and the map has not already been instantiated.. This will ensure that we only ever
 * call {@link #setUpMap()} once when {@link #mMap} is not null.
 * <p>
 * If it isn't installed {@link SupportMapFragment} (and
 * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
 * install/update the Google Play services APK on their device.
 * <p>
 * A user can return to this FragmentActivity after following the prompt and correctly
 * installing/updating/enabling the Google Play services. Since the FragmentActivity may not have been
 * completely destroyed during this process (it is likely that it would only be stopped or
 * paused), {@link #onCreate(Bundle)} may not be called again so we should call this method in
 * {@link #onResume()} to guarantee that it will be called.
 */
private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {

            // Replace the (default) location source of the my-location layer with our custom LocationSource
            mMap.setLocationSource(followMeLocationSource);

            // Set default zoom
            mMap.moveCamera(CameraUpdateFactory.zoomTo(15f));
        }
    }
}

private class FollowMeLocationSource implements LocationSource, LocationListener {

    private OnLocationChangedListener mListener;
    private LocationManager locationManager;
    private final Criteria criteria = new Criteria();
    private String bestAvailableProvider;
    /* Updates are restricted to one every 10 seconds, and only when
     * movement of more than 10 meters has been detected.*/
    private final int minTime = 10000;     // minimum time interval between location updates, in milliseconds
    private final int minDistance = 10;    // minimum distance between location updates, in meters

    private FollowMeLocationSource() {
        // Get reference to Location Manager
        locationManager = (LocationManager) getBaseContext().getSystemService(Context.LOCATION_SERVICE);

        // Specify Location Provider criteria
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        criteria.setAltitudeRequired(true);
        criteria.setBearingRequired(true);
        criteria.setSpeedRequired(true);
        criteria.setCostAllowed(true);
    }

    private void getBestAvailableProvider() {
        /* The preffered way of specifying the location provider (e.g. GPS, NETWORK) to use 
         * is to ask the Location Manager for the one that best satisfies our criteria.
         * By passing the 'true' boolean we ask for the best available (enabled) provider. */
        bestAvailableProvider = locationManager.getBestProvider(criteria, true);
    }

    /* Activates this provider. This provider will notify the supplied listener
     * periodically, until you call deactivate().
     * This method is automatically invoked by enabling my-location layer. */
    @Override
    public void activate(OnLocationChangedListener listener) {
        // We need to keep a reference to my-location layer's listener so we can push forward
        // location updates to it when we receive them from Location Manager.
        mListener = listener;

        // Request location updates from Location Manager
        if (bestAvailableProvider != null) {
            locationManager.requestLocationUpdates(bestAvailableProvider, minTime, minDistance, this);
        } else {
            // (Display a message/dialog) No Location Providers currently available.
        }
    }

    /* Deactivates this provider.
     * This method is automatically invoked by disabling my-location layer. */
    @Override
    public void deactivate() {
        // Remove location updates from Location Manager
        locationManager.removeUpdates(this);

        mListener = null;
    }

    @Override
    public void onLocationChanged(Location location) {
        /* Push location updates to the registered listener..
         * (this ensures that my-location layer will set the blue dot at the new/received location) */
        if (mListener != null) {
            mListener.onLocationChanged(location);
        }

        /* ..and Animate camera to center on that location !
         * (the reason for we created this custom Location Source !) */
        mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude())));
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
   }

}

My Permissions:

<uses-permission android:name="com.wandelen.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<!--
     The following two permissions are not required to use
     Google Maps Android API v2, but are recommended.
-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Besides that i did also check the android Google Maps application and it's receiving my location without any problem.

Also i did put breakpoints in all the functions of my FollowMeLocationSource but it doesn't break on non of all functions..

What am i missing? Or what can i try to receive my current position onload?

Community
  • 1
  • 1
Spons
  • 1,593
  • 1
  • 17
  • 46
  • so you just want to know what your current location is one time when the app loads? – tyczj Apr 11 '13 at 23:19
  • When i read from the post, that i referred too, that is what this code should do isn't it? But that is what i want indeed. I didn't have time to go outside to test if changing does work.. but i thought, if i understood it well, it would also load the initial state? – Spons Apr 11 '13 at 23:28

1 Answers1

4

If you just need a one time location I would use getLastKnowLocation from LocationManager that way you dont always have the GPS running for no reason.

EDIT:

well first of all I dont understand why you need to have that whole big class to get the location. the map itself does have a location listener

GoogleMap map = getMap();
map.setOnMyLocationChangeListener(this);

then in your map fragment implement OnMyLocationChangeListener and you will get callbacks when your location changes plus your initial location on first run like you want.

so that location class is basically overkill and useless unless you need to something special with the location manager.

Second, when you create the FollowMeLocationSource class I dont see anywhere where you request location updates which would be why it is not getting fired

tyczj
  • 71,600
  • 54
  • 194
  • 296
  • But wait my question also was if and why it is not provided by the supported code. I will try to add it manually. but the code in my post is supposed to arrange the getLastKnowLocation. Also on start no? But the event won't fire? I would like to solve the problem.. don't bypass it.. i will keep your solution in mind for later if no other answers come. – Spons Apr 12 '13 at 06:40