2015-12-02 56 views

回答

1

这真的取决于你的场景。

您需要考虑尽可能地“减少”应用程序中的GPS使用,与您的功能成比例。例如,如果您的应用程序只需要将设备的跟踪“点”发送到服务器 - 您可以打开GPS,使当前位置“快照”,然后关闭GPS或暂停GPS等。 ..

你的问题没有通用的解决方案,你需要在这里做一点思考:)。

+1

非常感谢我解决了这个问题,现在我面临的新问题是我的标记被拖动的很好,但是我希望标记随着设备移动而不断移动,而不是继续更新其位置 –

+0

是的,我认为你在这里有两个选择(如果你想保持电池使用率低),你可以保持视图更新的原样,或者你可以计算标记的“潜在”移动并在“快照”三角洲之间绘制。因此,用户将获得流畅的动画体验,但动作会被伪造... –

2

您需要配置刷新位置之后的时间。请参阅给定类中的常量。

MIN_TIME_BW_UPDATES和 MIN_DISTANCE_CHANGE_FOR_UPDATES

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 
import android.util.Log; 
import android.widget.Toast; 

public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 
    boolean isGPSEnabled = false; 
    boolean isNetworkEnabled = false; 
    boolean canGetLocation = false; 
    Location networklocation; // location 
    Location gpslocation; // location 
    double latitude; // latitude 
    double longitude; // longitude 
    float accuracy; 
    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 
    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 
    private static final float HOW_ACCURATE = 50; 
    // Declaring a Location Manager 
    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context;   
     getLocation(); 
    } 

    public Location getLocation() { 
     float currentAccuracy = HOW_ACCURATE + 1; 
     int returnWhat = 0; 

     try { 
      locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 
      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
      if (!isGPSEnabled && !isNetworkEnabled) { 
       // no network provider is enabled 
      } else { 

       this.canGetLocation = true; 
       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        Log.d("Network", "Network"); 
        if (locationManager != null) { 

         networklocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

         if (networklocation != null) { 
          this.latitude = networklocation.getLatitude(); 
          this.longitude = networklocation.getLongitude(); 
          currentAccuracy = networklocation.getAccuracy(); 
          returnWhat = 1; 
         } 
        } 
       } 

       if (isGPSEnabled) { 
        if (networklocation == null 
          || currentAccuracy > HOW_ACCURATE) { 

         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "GPS Enabled"); 

         if (locationManager != null) { 
          gpslocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (gpslocation != null) {  
           //Toast.makeText(mContext, "GPS Accuracy: "+gpslocation.getAccuracy()+", Current Accuracy: "+currentAccuracy, Toast.LENGTH_LONG).show(); 
           if (gpslocation.getAccuracy() < currentAccuracy) { 
            this.latitude = gpslocation.getLatitude(); 
            this.longitude = gpslocation.getLongitude(); 
            returnWhat = 2; 
           } 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     if (returnWhat == 1) { 
      Toast.makeText(mContext, "Getting location from Network", Toast.LENGTH_LONG).show(); 
      gpslocation = null; 
      this.accuracy = networklocation.getAccuracy(); 
      return networklocation; 
     } else if (returnWhat == 2) { 
      Toast.makeText(mContext, "Getting location from GPS", Toast.LENGTH_LONG).show(); 
      networklocation = null; 
      this.accuracy = gpslocation.getAccuracy(); 
      return gpslocation; 
     } else { 
      return null; 
     } 
    } 

    public float getLocAccuracy() { 
     return this.accuracy; 
    } 


    public void stopUsingGPS() { 
     if (locationManager != null) { 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 

    public double getLatitude() {    
     return this.latitude; 
    } 

    public double getLongitude() { 
     return this.longitude; 
    } 

    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 

    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     // Setting Dialog Title 
     alertDialog.setTitle("GPS is settings"); 

     // Setting Dialog Message 
     alertDialog 
       .setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

     // On pressing Settings button 
     alertDialog.setPositiveButton("Settings", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         Intent intent = new Intent(
           Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
         mContext.startActivity(intent); 
        } 
       }); 

     // on pressing cancel button 
     alertDialog.setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

} 
相关问题