1

我正在构建一个应用程序,通过检测汽车的速度来检测汽车何时移动或停车。我有一些检测当前速度的代码,但我不知道如何编写该代码,所以如果速度超过 20 公里/小时,那么做任何事情,如果速度是 0 公里/小时,那么做任何事情。

这是我的代码:

public class DeviceSpeedDemoActivity extends Activity implements GPSCallback{
    private GPSManager gpsManager = null;
    private double speed = 0.0;
    private int measurement_index = Constants.INDEX_KM;
    private AbsoluteSizeSpan sizeSpanLarge = null;
    private AbsoluteSizeSpan sizeSpanSmall = null;


    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        gpsManager = new GPSManager();

        gpsManager.startListening(getApplicationContext());
        gpsManager.setGPSCallback(this);

        ((TextView)findViewById(R.id.info_message)).setText(getString(R.string.info));

        measurement_index = AppSettings.getMeasureUnit(this);
    }

    @Override
    public void onGPSUpdate(Location location) 
    {
            location.getLatitude();
            location.getLongitude();
            speed = location.getSpeed();

            String speedString = "" + roundDecimal(convertSpeed(speed),2);
            String unitString = measurementUnitString(measurement_index);

            setSpeedText(R.id.info_message,speedString + " " + unitString);
    }

    @Override
    protected void onDestroy() {
            gpsManager.stopListening();
            gpsManager.setGPSCallback(null);

            gpsManager = null;

            super.onDestroy();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

            return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            boolean result = true;

            switch(item.getItemId())
            {
                    case R.id.menu_about:
                    {
                            displayAboutDialog();

                            break;
                    }
                    case R.id.unit_km:
                    {
                            measurement_index = 0;

                            AppSettings.setMeasureUnit(this, 0);

                            break;
                    }
                    case R.id.unit_miles:
                    {
                            measurement_index = 1;

                            AppSettings.setMeasureUnit(this, 1);

                            break;
                    }
                    default:
                    {
                            result = super.onOptionsItemSelected(item);

                            break;
                    }
            }

            return result;
    }
     private double convertSpeed(double speed){
            return ((speed * Constants.HOUR_MULTIPLIER) * Constants.UNIT_MULTIPLIERS[measurement_index]); 
    }

    private String measurementUnitString(int unitIndex){
            String string = "";

            switch(unitIndex)
            {
                    case Constants.INDEX_KM:                string = "km/h";        break;
                    case Constants.INDEX_MILES:     string = "mi/h";        break;
            }

            return string;
    }

    private double roundDecimal(double value, final int decimalPlace)
    {
            BigDecimal bd = new BigDecimal(value);

            bd = bd.setScale(decimalPlace, RoundingMode.HALF_UP);
            value = bd.doubleValue();

            return value;
    }

    private void setSpeedText(int textid,String text)
    {
            Spannable span = new SpannableString(text);
            int firstPos = text.indexOf(32);

            span.setSpan(sizeSpanLarge, 0, firstPos,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            span.setSpan(sizeSpanSmall, firstPos + 1, text.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            TextView tv = ((TextView)findViewById(textid));

            tv.setText(span);
    }

    private void displayAboutDialog()
    {
            final LayoutInflater inflator = LayoutInflater.from(this);
            final View settingsview = inflator.inflate(R.layout.about, null);
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setTitle(getString(R.string.app_name));
            builder.setView(settingsview);

            builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
            });

            builder.create().show();
    }
}
4

3 回答 3

0

您可以使用一个简单的if-elseif块。当您获得速度时,即onGPSUpdate,只需添加以下内容:

if(convertSpeed(speed) > 20.0){
    //Code for Speed Over 20
}
else{
    //code for speed less than 20
}

顺便说一句,当使用location.getLongitude()使用try-catch块时,因为它们总是不能很好地工作,而且你不想用强制关闭来惹恼用户。

于 2013-07-24T19:12:58.440 回答
0

我为飞行记录应用程序解决了类似的问题。我想检测滑行到跑道的开始、起飞、着陆和到达停车位置,以及一些更复杂的事情,比如一触即发。

这里一个有用的模式是状态机(或状态模式):您的应用程序保持一个状态(例如停止或运行;在我的示例中,停车、起飞的出租车、飞行中等)。如果在某个状态下,您会查找不同的事件:例如,如果在“停止”状态下,您会查看速度是否超过某个阈值,例如 5 公里/小时,或者位置是否发生变化并且超出某个距离阈值。如果处于“驾驶”状态,您检查速度是否低于某个阈值,如果发生这种情况,您查看它是否在该阈值以下保持一段时间(如果您想避免检测到像转弯这样的短暂停止)。等等。因此,您的应用程序处于确定传感器事件解释的特定状态。您的应用程序会评估传感器事件。

于 2013-07-25T15:58:49.397 回答
0

在您的方法onGPSUpdate()中,您应该能够确定此标准。

@Override
public void onGPSUpdate(Location location) 
{
    location.getLatitude();
    location.getLongitude();
    speed = location.getSpeed();

    double speedKPH = convertSpeed(speed);

    if(speedKPH > 20.0)
    {
        //Do something, Speed Over 20
    }else if(speedKPH == 0)
    {
        //Do something else, speed 0
    }

    String speedString = "" + roundDecimal(convertSpeed(speed),2);
    String unitString = measurementUnitString(measurement_index);

    setSpeedText(R.id.info_message,speedString + " " + unitString);
}
于 2013-07-24T18:44:08.447 回答