Google maps api v2 Android 未在 locationListener 上更新

Posted

技术标签:

【中文标题】Google maps api v2 Android 未在 locationListener 上更新【英文标题】:Google maps api v2 Android Not updating on locationListener 【发布时间】:2013-04-11 23:02:03 【问题描述】:

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

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

我现在使用的代码来自以下主题:https://***.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 Google Maps 应用程序,它可以毫无问题地接收我的位置。

我也确实在我的 FollowMeLocationSource 的所有函数中设置了断点,但它不会在所有函数中都中断..

我错过了什么?或者我可以尝试什么来接收我当前的加载位置?

【问题讨论】:

所以您只想知道应用加载时您当前的位置? 当我从帖子中阅读时,我也提到了,这就是这段代码应该做的不是吗?但这确实是我想要的。我没有时间去外面测试改变是否有效。但我想,如果我理解得很好,它也会加载初始状态? 【参考方案1】:

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

编辑:

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

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

然后在你的地图片段中实现OnMyLocationChangeListener,当你的位置改变时你会得到回调,加上你想要的第一次运行的初始位置。

因此,除非您需要位置管理器的特殊功能,否则该位置类基本上是多余且无用的。

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

【讨论】:

但是等一下,我的问题也是支持的代码是否以及为什么不提供它。我会尝试手动添加它。但我帖子中的代码应该安排 getLastKnowLocation。也开始没有?但事件不会触发?我想解决这个问题..不要绕过它..如果没有其他答案,我会记住你的解决方案。

以上是关于Google maps api v2 Android 未在 locationListener 上更新的主要内容,如果未能解决你的问题,请参考以下文章