如何有可能在位置更新频率(每秒、每分钟等)之间进行选择?
Posted
技术标签:
【中文标题】如何有可能在位置更新频率(每秒、每分钟等)之间进行选择?【英文标题】:how to have the possibility to chose between the frequency of the locationupdates(every seconds,minutes etc..)? 【发布时间】:2012-07-20 14:11:38 【问题描述】:您好,我只是想知道如何通过单击菜单项来修改位置更新的频率 我尝试了这个,但我在这里所做的似乎并不好(代码添加在下面),因为我没有以所选频率获得位置更新。 我只想知道是否可以更改频率以及最好的实施方式。 我希望能够通过单击子菜单项刷新位置:仅一次、每秒或每 2 分钟。 项目选择结束
谁能告诉我,如果我做的是对的,而不是让我知道我该怎么做? 在此先感谢
代码如下:
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import android.content.Intent;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class MapLocator extends MapActivity implements LocationListener
/** Called when the activity is first created. */
private LocationManager lm;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
mapView = (MapView) this.findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
mc = mapView.getController();
mc.setZoom(14);
int FIVE_MINUTES = 5 /*Minutes*/ * 60 /*sec per min*/ * 1000 /*ms per sec*/;
lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, FIVE_MINUTES, 0, this);
Drawable drawable= this.getResources().getDrawable(R.drawable.loc_seven);
ListItimizedOverlay itemizedoverlay = new ListItimizedOverlay(drawable);
GeoPoint p = new GeoPoint(33000000,84000000);
OverlayItem overlayitem = new OverlayItem(p, "Hello from", "Tahiti");
itemizedoverlay.addOverlayItem(overlayitem);
mapView.getOverlays().add(itemizedoverlay);
@Override
protected boolean isRouteDisplayed()
return false;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if (keyCode == KeyEvent.KEYCODE_S)
mapView.setSatellite(!mapView.isSatellite());
return true;
return super.onKeyDown(keyCode, event);
@Override
public void onLocationChanged(Location location)
Log.d("msg","1");
lat = location.getLatitude();
lng = location.getLongitude();
Toast.makeText(
getBaseContext(),
"Location change to : Latitude = " + lat + " Longitude = "
+ lng, Toast.LENGTH_SHORT).show();
GeoPoint p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
mc.animateTo(p);
mc.setCenter(p);
mc.setZoom(14);
Drawable drawable= this.getResources().getDrawable(R.drawable.loc_seven);
ListItimizedOverlay itemizedoverlay = new ListItimizedOverlay(drawable);
OverlayItem overlayitem = new OverlayItem(p, "", "");
itemizedoverlay= (ListItimizedOverlay ) mapView.getOverlays().get(0);
itemizedoverlay.clear();
itemizedoverlay.addOverlayItem(overlayitem);
mapView.getOverlays().add(itemizedoverlay);
@Override
public void onProviderDisabled(String provider)
if(provider.equals("LocationManager.GPS_PROVIDER"))
Toast.makeText(MapLocator.this, "GPS is off", Toast.LENGTH_LONG).show();
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
@Override
public void onProviderEnabled(String provider)
Log.v("main", "Enabled");
Toast.makeText(MapLocator.this, "GPS Enabled", Toast.LENGTH_SHORT).show();
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
@Override
public void onPause()
super.onPause();
lm.removeUpdates(this);
//Méthode qui se déclenchera lorsque vous appuierez sur le bouton menu du téléphone
public boolean onCreateOptionsMenu(Menu menu2)
//Création d'un MenuInflater qui va permettre d'instancier un Menu XML en un objet Menu
MenuInflater inflater = getMenuInflater();
//Instanciation du menu XML spécifier en un objet Menu
inflater.inflate(R.layout.menumap, menu2);
return true;
public boolean onOptionsItemSelected(MenuItem item)
//On regarde quel item a été cliqué grâce à son id et on déclenche une action
switch (item.getItemId())
case R.id.refresh:
return true;
case R.id.refreshonce:
this.lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null);
Toast.makeText(MapLocator.this, "refreshnow", Toast.LENGTH_LONG).show();
return true;
case R.id.refresheachsec:
this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
Toast.makeText(MapLocator.this, "refresh2", Toast.LENGTH_LONG).show();
return true;
case R.id.refresheach2min:
this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2*60*1000, 0, this);
Toast.makeText(MapLocator.this, "refresh2", Toast.LENGTH_LONG).show();
return true;
case R.id.refresheach5min:
this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5*60*1000, 0, this);
Toast.makeText(MapLocator.this, "refresh5", Toast.LENGTH_LONG).show();
return true;
case R.id.quitter:
finish();
return true;
【问题讨论】:
请记住,最小时间间隔实际上是一个建议。 developer.android.com/reference/android/location/…, long, float, android.location.LocationListener) 【参考方案1】:我建议在使用新时间请求更新之前使用LocationManager.removeUpdates()
。另请注意,在 JellyBean (4.1) 中,更新之间的最短时间不再只是一个提示。
请看:Location Manager in Android
“在 Jellybean 之前,minTime 参数只是一个提示,一些位置提供程序实现忽略了它。从 Jellybean 及以后,Android 兼容设备必须遵守 minTime 和 minDistance 参数。”
【讨论】:
以上是关于如何有可能在位置更新频率(每秒、每分钟等)之间进行选择?的主要内容,如果未能解决你的问题,请参考以下文章