我正在制作一款使用GPS追踪系统的Android应用程序,但它使用了大量电池,如何优化我的应用以降低电池使用量?
答案 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;
}
}
答案 1 :(得分:1)
这真的取决于你的情况。
你需要考虑&#34;减少&#34;您的应用中的GPS使用量尽可能与您的功能成比例。
例如,如果您的应用程序只需要发送跟踪&#34;点&#34;设备到服务器 - 您可以转动GPS,获取当前位置&#34;快照&#34;然后关掉GPS或暂停它等等......
你的问题没有通用的解决方案,你需要在这里做一点思考:)。