为啥在调试 android google maps 示例时没有调用我的 onLocationChanged() 方法?

Posted

技术标签:

【中文标题】为啥在调试 android google maps 示例时没有调用我的 onLocationChanged() 方法?【英文标题】:Why isn't my onLocationChanged() method being called while debugging android google maps example?为什么在调试 android google maps 示例时没有调用我的 onLocationChanged() 方法? 【发布时间】:2013-02-15 00:47:24 【问题描述】:

一切似乎都运行良好。它可以找到我的位置,但不会调用 onLocationChanged() 方法并为我创建标记。有什么想法吗?

public class MainActivity extends FragmentActivity implements LocationListener

Context context = this;
GoogleMap googlemap;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initMap();

    LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
    String provider = lm.getBestProvider(new Criteria(), true);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, this);


public void onLocationChanged(Location location) 
    LatLng current = new LatLng(location.getLatitude(), location.getLatitude());
    Date date = new Date();

    googlemap.addMarker(new MarkerOptions()
            .title("Current Pos")
            .snippet(new Timestamp(date.getTime()).toString())
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
            .position(current)
            );


public void onStatusChanged(String provider, int status, Bundle extras) 


public void onProviderEnabled(String provider) 


private void initMap()
    SupportMapFragment mf = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    googlemap = mf.getMap();

    googlemap.setMyLocationEnabled(true);
    googlemap.setMapType(GoogleMap.MAP_TYPE_NORMAL);


【问题讨论】:

【参考方案1】:

您的 Activity 需要实现 LocationSource 接口,并且您需要注册您的 GoogleMap 以使用 MainActivity 类作为其位置源:

将你的类声明更改为:

public class MainActivity extends FragmentActivity implements LocationListener, LocationSource

并设置 GoogleMap 的 LocationSource

//This is how you register the LocationSource for the map
googleMap.setLocationSource(this);

有关完整示例,请参阅this answer。

【讨论】:

【参考方案2】:

你有wifi吗?一切似乎都定义明确。

【讨论】:

是的,我也关掉了它,只是为了使用 GPS。我应该在这里更改什么: LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);或 lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, this):【参考方案3】:

也许您的 wifi 信号很弱并且您遇到了连接问题?尝试通过 GPS 提供商获取位置更新:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, this);

事实上,我总是将两者都包含在内,以便用户可以从任一提供商处获取他的位置。此外,请尝试在 onLocationChanged 回调中包含一条日志语句。如果事实证明该方法实际上正在被调用,那么您就知道您的问题在于添加标记,而不是您的位置检索。

【讨论】:

一个简单的调试日志语句应该做:Log.d("Name_of_class_here", "Location has updated!");如果到达该行,这将在您的 logcat 中作为调试语句打印。 不,调试没有被调用。所以 locationChanged() 以某种方式没有被调用。我必须对听众做点别的吗? 嗯……我看不出你的监听器有什么问题……你说“它可以找到我的位置,但它不会调用 onLocationChanged() 方法” -你这是什么意思? 我可以到外面按下当前位置的按钮,它会转到我当前的位置。所以它正在获得更新。我应该在另一个类中实现监听器吗?或者我应该为标准设置一些不同的东西? 'this' 适合在 requestLocationUpdates 中使用吗? 您确定您的手机没有响应您当前位置附近的先前位置更新吗?如果你移动一段相当长的距离(比如一个方块)并再次按下它,它会识别出你已经移动了吗?我从来没有将 Activity 本身用作 locationListener - 我总是为它创建一个匿名类。我看不出你实现它的方式有什么问题,但我会尝试为它创建一个单独的类,看看它是否有效。我觉得标准很好。

以上是关于为啥在调试 android google maps 示例时没有调用我的 onLocationChanged() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我部署的 Android 应用无法登录 Google Play 服务,而我的调试应用却可以登录?

为啥 Google Maps Cordova ionic angular 仅在 Android 中工作而在 IOS 中为空白?

Google Maps Android API 是不是在发布模式下工作?

如何在现有的旧版Android项目中使用最新的API添加Google Map?

为啥 MapView 显示的少于 Map 应用程序?

Android:Google Map v2 未显示发布 apk 的地图