我正在构建一个应用程序,通过检测其速度来检测汽车何时移动或停车。 我有一些代码可以检测当前的速度,但我不知道如何编写代码,所以如果速度超过20 km / h那么做什么,如果速度是0 km / h那么做什么。
这是我的代码:
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();
}
}
答案 0 :(得分: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);
}
答案 1 :(得分: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
块,因为它们总是不能很好地工作,并且你不想用强制关闭来惹恼用户。
答案 2 :(得分:0)
我解决了飞行记录应用程序的类似问题。我想检测滑行到跑道,起飞,降落和到达停车位置的开始,以及一些更复杂的事情,如触摸和走动。
这里有用的模式是状态机(或状态模式):您的应用程序保持状态(例如停止或运行;在我的示例中停车,出租车起飞,飞行中等等)。如果在某种状态下,您会寻找不同的事件:例如如果处于“停止”状态,则查看速度是否超过某个阈值,例如5 km / h或如果位置发生变化且超出了某个距离阈值。如果处于“驾驶”状态,则检查速度是否低于某个阈值,如果发生这种情况,您会查看它是否在一段时间内保持低于该阈值(如果您想避免像转弯那样检测到短暂停止)。等等。 因此,您的应用程序处于某种状态,决定了传感器事件的解释。您的应用评估传感器事件。如果评估支持一个应该改变状态的假设,则转换到当前状态并切换状态。