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 Android API V2 检查 Google Maps 应用程序是不是被禁用
捕获 Google Map Android API V2 的屏幕截图