2013-07-24 2 views
1

나는 자동차가 움직이거나 주차 할 때를 감지하여 속도를 감지하는 앱을 개발 중입니다. 현재 속도를 감지하는 코드가 있지만 속도를 20km/h 이상으로 돌리면 아무 것도하지 않고 속도가 0km/h이면 아무 것도하지 않도록 해당 코드를 쓰는 방법을 모르겠습니다. 당신의 방법 onGPSUpdate()에서자동차가 움직이거나 멈 추면 안드로이드가 감지합니다.

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

if-then-else가 적합하지 않은 이유는 무엇입니까? –

+0

if-else와 같은 조건을 지정하십시오. –

+2

새로운 위치 인식을 조사해야합니다. 그것은 기본적으로 당신을 위해이 모든 힘든 일을합니다. http://developer.android.com/training/location/activity-recognition.html – roostertech

답변

0

, 당신은이 기준을 판단 할 수 있어야한다 :

여기 내 코드입니다.

@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); 
} 
0

간단한 if-elseif 블록을 사용할 수 있습니다. 그들이 잘 항상 작동하지 않는 등의 try-catch 블록을 사용 location.getLongitude()를 사용하여 그런데

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

, 당신은 성가 시게하고 싶지 않은 : 당신이 당신의 속도, 즉 onGPSUpdate을 받고 때, 그냥 다음을 추가 강제 폐쇄와 사용자.

0

비행 기록 응용 프로그램에서 비슷한 문제가 해결되었습니다. 나는 활주로에 택시를 타기 시작하고, 이륙하고, 착륙하고, 주차 위치에 도착하는 것을 감지하고 싶었고, 터치 앤 가더처럼 좀 더 복잡한 것들을 발견하기를 원했습니다.

여기 유용한 패턴은 상태 시스템 (또는 상태 패턴)입니다. 앱이 상태 (예 : 주차, 택시 타기, 이륙 중, 비행 중 등)를 유지합니다 에). 특정 상태에서 다른 이벤트를 찾는 경우 : 예 : 상태가 "중지됨"상태이면 속도가 특정 임계 값을 초과하는지 봅니다. 5 km/h 또는 위치가 변경되고 특정 거리 임계 값을 초과하는 경우 "주행 중"상태에서 속도가 특정 임계 값 아래로 떨어지는 지 확인한 다음 일정 시간 동안 임계 값 아래로 유지되는지 확인합니다 (회전을 멈추는 것과 같은 짧은 정류장을 감지하지 않으려는 경우). 등등. 따라서 앱이 센서 이벤트의 해석을 결정하는 특정 상태에 있습니다. 앱이 센서 이벤트를 평가합니다. 평가가 현재 상태를 변경해야한다는 가설을 뒷받침하는 경우 상태를 전환합니다.

관련 문제