2013-05-15 8 views
8

में एक्सेलेरोमीटर का उपयोग करके सटीक रूप से आंदोलन का पता लगाएं, मैं कंपन (एक विशेष स्थिति पर) के साथ एक डेमो टिमर लागू कर रहा हूं, जब मैं अपना टाइमर शुरू करना शुरू करता हूं .. और जब मैं इसे स्टॉप बटन का उपयोग करके रोकता हूं, तो यह बस बंद हो जाता है।Android

अब जब मैं डिवाइस (टाइमर चल रहा है) को स्थानांतरित करता है, तो मुझे कार्यक्षमता को एकीकृत करना होगा, इसे टाइमर को रीसेट करना चाहिए। यह बहुत अच्छा काम कर रहा है, लेकिन एक्सेलेरोमीटर कार्यक्षमता बिल्कुल सटीक काम नहीं कर रही है। टाइमर को रीसेट करने के लिए इसे तेज झटका चाहिए।

मुझे इसके लिए एक अच्छा समाधान सुझाएं।

यहाँ मेरी कोड

public class SensorAccelerometer implements SensorEventListener { 

    private Context context; 
    private SensorManager sensorManager; 
    private Sensor accelerometer; 
    private TextView timelabel; 
    private Handler mHandler; 
    Runnable run; 

    private float mLastX, mLastY, mLastZ; 
    private final float NOISE = (float) 3.0; 

    public SensorAccelerometer(Context context) { 

    } 


    public SensorAccelerometer(Context context,TextView timelabel, Handler mHandler2, Runnable mUpdateTimeTask) { 
     // TODO Auto-generated constructor stub 

     this.context = context; 
     this.timelabel = timelabel; 
     this.mHandler = mHandler2; 
     this.run = mUpdateTimeTask; 

     initialiseSensor(); 
    } 


    public void initialiseSensor(){ 
     sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); 
     accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ALL); 
     sensorManager.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    public void unregisterSensor(){ 
     sensorManager.unregisterListener(this); 
     Toast.makeText(context, "Sensor Stopped..", Toast.LENGTH_SHORT).show(); 
    } 


    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 

    mAccelLast=mAccelCurrent; 

    mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z); 
    float delta = mAccelCurrent - mAccelLast; 
    mAccel = mAccel * 0.9f + delta; 

    if(mAccel>0.5){ 
     TimerActivity.mStartTime = SystemClock.uptimeMillis(); 
     mHandler.removeCallbacks(run); 
     mHandler.postDelayed(run, 100); 
    } 

}

टाइमर गतिविधि

public class TimerActivity extends Activity { 

    public static long mStartTime = 0L; 
    private TextView mTimerLabel; 

    private Handler mHandler = new Handler(); 

    String timerStop1; 

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

     mTimerLabel = (TextView) findViewById(R.id.textTimer); 

     Button timerStartButton = (Button) findViewById(R.id.btnTimer);  
     timerStartButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view){ 

       if(mStartTime == 0L){ 
        mStartTime = SystemClock.uptimeMillis(); 
        mHandler.removeCallbacks(mUpdateTimeTask); 
        mHandler.postDelayed(mUpdateTimeTask, 100); 

        //activating the sensor and the acclerometer 
        SensorAccelerometer acc = new SensorAccelerometer(view.getContext(), mTimerLabel,mHandler,mUpdateTimeTask); 
       }         
      } 
     }); 

     Button timerStopButton = (Button) findViewById(R.id.btnTimerStop);  
     timerStopButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view){ 

       mHandler.removeCallbacks(mUpdateTimeTask); 
       mTimerLabel.setText(timerStop1); 
       mStartTime = 0L; 

       SensorAccelerometer scc = new SensorAccelerometer(view.getContext(),mTimerLabel,mHandler,mUpdateTimeTask); 
       scc.unregisterSensor(); 
      } 
     }); 

    } 


    private Runnable mUpdateTimeTask = new Runnable(){ 

     public void run() { 

      final long start = mStartTime; 
      long millis = SystemClock.uptimeMillis()- start; 

      int seconds = (int) (millis/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 

      mTimerLabel.setText("" + minutes + ":" 
            + String.format("%02d", seconds));      

      timerStop1 = minutes + ":" 
         + String.format("%02d", seconds); 

      mHandler.postDelayed(this, 200);    

     } 
    }; 

    protected void onPause() { 
     super.onPause(); 
     SensorAccelerometer scc = new SensorAccelerometer(this,mTimerLabel,mHandler,mUpdateTimeTask); 
     scc.unregisterSensor(); 
    }; 

} 

उत्तर

6

मुझे लगता है कि आपके ऐप के विकास में अगला चरण स्प्रेडशीट में उत्पादित त्वरण के मूल्यों को देखना है। मैं इसके लिए एक्सेल का उपयोग करता हूं, लेकिन कोई भी उपकरण जो ग्राफ उत्पन्न कर सकता है। तो

public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 

    float mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z); 
    float mAccel = mAccel * 0.9f + mAccelCurrent * 0.1f; 
    Log.d("onSensorChanged",System.currentTimeMillis()+","+mAccelCurrent +","+mAccel); 

} 

की तरह कुछ करने के लिए onSensorChanged() बदल और फिर आप एंड्रॉयड प्रवेश तंत्र में मौजूदा समय, mAccelCurrent और mAccel पर कब्जा कर सकते हैं। वैकल्पिक रूप से, अपनी खुद की टेक्स्ट फ़ाइल बनाएं, वहां मान लिखें, और फ़ाइल को उस टूल में खोलें जो ग्राफ़ उत्पन्न कर सके। ग्राफ से, आप तय कर सकते हैं कि आपके ट्रिगर के लिए कौन से मूल्यों का उपयोग करना है।

+0

मेरा सरल सवाल यह है कि झुकाव डेटा कैसे जांचें, (जब डिवाइस झुका हुआ हो) और मैं उस पर कोड का एक सेट करना चाहता हूं। क्या आपके पास उपरोक्त कोड के बारे में कोई समाधान है .. –

+0

@stochastically। मेरा प्रश्न –

+0

जैसा ही है, मैंने सोचा था कि आप गति का पता लगाने के लिए एक्सेलेरोमीटर डेटा का उपयोग करना चाहते थे। ऐसा करने के लिए, आपको डेटा को समझने की आवश्यकता है, इसलिए इसे लॉग करने की आवश्यकता है और इसे देखें। यदि आप सिर्फ यह जांचना चाहते हैं कि डिवाइस कब झुका हुआ है तो यह बहुत आसान है। उदाहरण के लिए, मेरे answser [link] देखें (http://stackoverflow.com/questions/16571798/android-device-angle-on-vertical-axis-while-device-stays-still/16572641#16572641)। पिच कोण शायद आप जो खोज रहे हैं। – Stochastically

2

दो सुझाव, और एक सोचा है:

  1. संगत व्यवहार के लिए, आप की लंबाई पर गौर करना चाहिए घटना मूल्य। वेक्टर, यानि Math.sqrt(x*x+y*y+z*z), व्यक्तिगत मूल्यों की बजाय। गणितीय रूप से, यह Math.sqrt(x*x+y*y+z*z) है जो आपके समन्वय प्रणाली से स्वतंत्र है, यानी डिवाइस कैसे जमीन के सापेक्ष उन्मुख है, जबकि व्यक्तिगत संख्या x, y, z नहीं हैं।
  2. आपका वर्तमान ऐप त्वरण में परिवर्तन की तलाश करता है। इसके बजाए, मुझे लगता है कि आपको केवल उच्च त्वरण की तलाश करनी चाहिए, यानी Math.sqrt(x*x+y*y+z*z) के बड़े मूल्यों को देखना चाहिए।
  3. मैंने हाल ही में पेडोमीटर के लिए एक्सेलेरोमीटर का उपयोग करने के बारे में this answer लिखा है, और मुझे लगता है कि आपको यह दिलचस्प लगेगा।

+0

आपने एक बहुत अच्छा जवाब दिया है, लेकिन मैं समझ नहीं पा रहा हूं कि डिवाइस की गति की जांच करने के लिए मुझे क्या करना चाहिए। मुझे अपना कोड कहां बदलना चाहिए .. ताकि यदि कोई व्यक्ति डिवाइस की स्थिति को थोड़ा बदलता है, तो मुझे इसे प्राप्त करना चाहिए। –

+0

मेरी टिप्पणियां 1 और 2 दोनों 'ऑन सेंसर चेंज (सेंसर इवेंट इवेंट)' के कार्यान्वयन से संबंधित हैं। आपकी पहली 3 लाइनें ठीक हैं, जहां आपने एक्स, वाई, और जेड सेट किया है, लेकिन फिर आपको (1) 'len = Math.sqrt (x * x + y * y + z * z) प्राप्त करने की आवश्यकता है। और (2) निर्धारित करें कि 'len' सामान्य से अधिक बड़ा है आदि – Stochastically

+2

मुझे नहीं लगता कि इस तरह के प्रश्न को संपादित करना एक अच्छा विचार है, क्योंकि मेरा जवाब और हमारी बातचीत अब दूसरों को कम समझ में आती है। साथ ही, आपका संपादन अधूरा है क्योंकि मैक्सेल जैसे चर कहीं भी घोषित नहीं किए जाते हैं। यदि आपको अभी भी समस्याएं आ रही हैं तो आपको एक नया प्रश्न शुरू करना चाहिए। ऐसा कहा जाता है, ऐसा लगता है कि आप 'mccel' को' mccelCurrent' का एक आसान तरीका अजीब तरीके से बनाने की कोशिश कर रहे हैं। इसके बजाय मैं सुझाव देता हूं 'mccel = mccel * 0.9f + mAccelCurrent * 0.1f'। इससे परे, मुझे लगता है कि आपको एक फ़ाइल में मैकेल और मैकेलकंटेंट को लॉग इन करना चाहिए, परिणामों की जांच करनी चाहिए, और तय करना चाहिए कि उससे क्या करना है। – Stochastically

 संबंधित मुद्दे