我不确定这是否是提出这个问题的正确位置,也许这里有一个合适的Stackexchange站点,但无论如何这里都是我的问题。
我最近为我的Android智能手机开发了GPS跟踪应用程序,以便我的妻子可以跟踪自己和我们10岁的儿子骑自行车/野营旅行。应用程序记录了我们的GPS位置(或网络位置,具体取决于可用性),并将纬度和经度坐标上传到我的服务器,这些坐标存储在数据库中。然后我的妻子可以使用Google Maps Api在网页上查看这些坐标。
该应用程序运行良好,但它依赖于我的智能手机的电池寿命。我不得不依靠USB电池充电器来保持手机充电。是否有基于Android的设备,我可以安装我的跟踪APK到具有GPS和移动网络,以便您可以添加一个SIM卡。该设备需要非常小巧紧凑,电池寿命长,不需要屏幕,因此不一定是手机或平板电脑。
修改
感谢@ apmartin1991的回答。我没有使用DDMS来检查电池性能,但我的手机报告GPS使用率很低。我会看一下DDMS。我的代码如下所示。基本上它每10分钟ping一次GPS,网络12分钟。如果它发现它发现GPS的最后已知时间比找到网络位置时更新,它将使用GPS,否则它将找到网络。检索位置时,它将通过异步任务发布到我的服务器并存储在数据库中。除了简化代码,我仍然希望找到一种专用设备,不仅可以延长电池寿命,还可以将手机与智能设备分开。我知道那里有商业产品。我在Garmin宠物追踪器等工作中使用过这样的设备,但这些设备往往大约165英镑加上变化。
代码:
Timer timer;
LocationManager locationManager;
// Ping GPS every 10 minutes
private static final int GPS_INTERVAL = 1000 * 60 * 10;
// Ping network every 12 minutes
private static final int NET_INTERVAL = 1000 * 60 * 12;
private ProgressDialog dialog;
TextView latText, lngText, locText;
String lat = "";
String lng = "";
String loc_service = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
latText = (TextView)findViewById(R.id.latText);
lngText = (TextView)findViewById(R.id.lngText);
locText = (TextView)findViewById(R.id.locText);
locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_INTERVAL, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, NET_INTERVAL, 0, locationListener);
timer = new Timer();
timer.schedule(new GetGPSStatus(), GPS_INTERVAL);
}
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
timer.cancel();
Log.d("Coords",lat+" "+lng+" "+loc_service);
latText.setText(lat);
lngText.setText(lng);
locText.setText(loc_service);
if(lat != "" && lat != "") {
String data[] = {lat, lng, loc_service};
new SaveCoordsToDb(AmLocation.this).execute(data);
}
timer = new Timer();
timer.schedule(new GetGPSStatus(), 1000);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
class GetGPSStatus extends TimerTask {
@Override
public void run() {
Location gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Location net_loc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
// If the last GPS location is newer than the network time, use the gps
// otherwise use the network location
if(gps_loc.getTime() > net_loc.getTime()) {
lat = String.valueOf(gps_loc.getLatitude());
lng = String.valueOf(gps_loc.getLongitude());
loc_service = LocationManager.GPS_PROVIDER;
}
else {
lat = String.valueOf(net_loc.getLatitude());
lng = String.valueOf(net_loc.getLongitude());
loc_service = LocationManager.NETWORK_PROVIDER;
}
}
}
// Save GPS data to the remote server db
public class SaveCoordsToDb extends AsyncTask<String, Void, String> {
InputStream is = null;
String result = "";
private ProgressDialog dialog;
private Context context;
public SaveCoordsToDb(Context baseContext) {
context = baseContext;
}
@Override
protected void onPreExecute(){
super.onPreExecute();
dialog = new ProgressDialog(context);
try {
dialog.setMessage("Updating GPS Location ...");
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
}
catch(Exception e) {
Log.e("Dialog",e.toString());
}
}
@Override
protected String doInBackground(String... urls) {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("lng", urls[0]));
nameValuePairs.add(new BasicNameValuePair("lat", urls[1]));
nameValuePairs.add(new BasicNameValuePair("source", urls[2]));
HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost("http://myserveraddy.co.uk/index/save");
try {
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(post);
HttpEntity entity = response.getEntity();
is = entity.getContent();
Log.d("POST","200");
}
catch (Exception e) {
Log.e("POST", e.toString());
}
return null;
}
@Override
protected void onPostExecute(String result) {
dialog.dismiss();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();`
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
}
}
答案 0 :(得分:0)
电池续航时间不会因您的设备而异,所有设备中的GPS通常使用相同的电量,我不认为手机是电源耗尽的原因,它不断向GPS发送ping并且你的服务器。
在没有查看代码的情况下很难分辨出使用大量电池的情况,您是否使用DDMS来查找使用大量电池/ CPU时间的代码?
我有一个类似的问题,手机的电池寿命将持续不到30分钟到一小时,我也认为这是由于GPS,我后来发现这是代码中的问题,无论是GPS还是套接字代码。在改变了一些代码后,根据使用情况,我的电池使用时间超过6到10小时。
您也可以发布一些代码,GPS任务/如何写入数据库,等等。然而,DDMS将是您的最佳选择,因为您可以看到使用最多CPU时间/系统资源的内容,这可以突出显示您在代码中遇到的任何问题,然后再开始研究可能无法为您提供额外电池寿命的其他设备
答案 1 :(得分:0)
Raspberry Pi是一种便宜又好的替代品。 http://www.milos.ivanovic.co.nz/blog/252
有关详细信息,请访问他们的网站: http://www.raspberrypi.org/