Google maps api v2 Android不在locationListener上更新

时间:2013-04-11 23:02:04

标签: android google-maps

我正在寻找一段时间为什么我的Google Map v2没有收到任何更新。

我一直在阅读/寻找几种解决方案,但无法找到解决方案。 因此,我不认为这个主题是重复的。因为解决方案我还没有找到。

我现在使用的代码来自以下主题: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) {

    }
   }

}

我的权限:

<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" />

除此之外,我还检查了Android谷歌地图应用程序,它正在接收我的位置没有任何问题。

此外,我确实在FollowMeLocationSource的所有函数中添加了断点,但它并没有在所有函数中断开..

我缺少什么?或者我可以尝试接收当前的位置?

1 个答案:

答案 0 :(得分:4)

如果您只需要一次性位置,我会使用LocationManager中的getLastKnowLocation,这样您就不会无缘无故地运行GPS。

编辑:

首先,我不明白为什么你需要有整个大班来获得这个位置。地图本身确实有一个位置监听器

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

然后在您的地图片段工具OnMyLocationChangeListener中,当您的位置更改时,您将获得回调,并在首次运行时获得您想要的初始位置。

因此,除非您需要与位置管理员合作的特殊内容,否则位置类基本上是过度杀伤和无用的。

其次,当你创建FollowMeLocationSource类时,我没有看到你请求位置更新的任何地方,这就是它没有被解雇的原因