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 上更新的主要内容,如果未能解决你的问题,请参考以下文章

可以吗? GMap API V2 中的 clearOverlays() 到 Google Maps API V3?

使用 Google Maps API v2 获取行车路线

Google Maps Android API V2 检查 Google Maps 应用程序是不是被禁用

捕获 Google Map Android API V2 的屏幕截图

居中位图标记(Google Maps Android API v2)

Google Maps Android API v2,错误的标记位置