如何有可能在位置更新频率(每秒、每分钟等)之间进行选择?

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 参数。”

【讨论】:

以上是关于如何有可能在位置更新频率(每秒、每分钟等)之间进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

电池高效的 android 小部件,每分钟更新一次

ZABBIX监控每秒业务状态

是否有可能每分钟在 iOS 后台进行自动更新?

如何在我们走路时获得实时的当前位置更新

轮询位置更新频率降低对电池的影响?

如何进行每小时位置更新?