适用于Android gps应用的硬件解决方案

时间:2014-08-13 13:26:36

标签: android gps sim-card android-hardware

我不确定这是否是提出这个问题的正确位置,也许这​​里有一个合适的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());
        }
    }
}

2 个答案:

答案 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/