我正在寻找一段时间为什么我的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的所有函数中添加了断点,但它并没有在所有函数中断开..
我缺少什么?或者我可以尝试接收当前的位置?
答案 0 :(得分:4)
如果您只需要一次性位置,我会使用LocationManager
中的getLastKnowLocation,这样您就不会无缘无故地运行GPS。
编辑:
首先,我不明白为什么你需要有整个大班来获得这个位置。地图本身确实有一个位置监听器
GoogleMap map = getMap();
map.setOnMyLocationChangeListener(this);
然后在您的地图片段工具OnMyLocationChangeListener
中,当您的位置更改时,您将获得回调,并在首次运行时获得您想要的初始位置。
因此,除非您需要与位置管理员合作的特殊内容,否则位置类基本上是过度杀伤和无用的。
其次,当你创建FollowMeLocationSource
类时,我没有看到你请求位置更新的任何地方,这就是它没有被解雇的原因