рдЬрдм рд╕реЗ рдореБрдЭреЗ рдПрдХ Google рдлреЛрди рдорд┐рд▓рд╛ рд╣реИ, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕рдордп-рд╕рдордп рдкрд░ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдШреВрдорддреЗ рд░рд╣рддреЗ рд╣реИрдВ: "рдЗрд╕ рдлреЛрди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдордЬрд╝рд╛ рдЖрдПрдЧрд╛?" рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдирд┐рдпрдВрддреНрд░рдг рдЦрд┐рд▓реМрдиреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ - рдореИрдВ рдЗрд╕ рд╕реЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдмреЗрд╢рдХ, рддреНрд╡рд░рдг рдХреЛ рдорд╛рдкреЗрдВ! рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЧрддрд┐ рдФрд░ рджреВрд░реА рдХреА рдпрд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рдмреЗрд╢рдХ, рдХреЗрд╡рд▓ рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдкрд╛ рдкрд░ рдХрдИ рд╕реАрдорд╛рдПрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдВрджреЛрд▓рди рдХреЛ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рджреВрд╕рд░реЗ, рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рддреАрд╕рд░рд╛, рдорд╛рдк рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдВрд╕рд░ рдХреЛ рдХреИрд▓рд┐рдмреНрд░реЗрдЯ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред
рдореБрдЦреНрдп рд╕рд╡рд╛рд▓, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, "рдХреНрдпреЛрдВ?"ред рдЬреАрдкреАрдПрд╕ рд╣реИ рддреЛ рдХреНрдпреЛрдВ рд╣реИ? рдЦреИрд░, рдПрдХ рд╕рдЪреНрдЪреА рдмрд╛рддред рд╣рд╛рд▓рд╛рдБрдХрд┐, GPS рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ - рдпрд╣ рдлреЛрди рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдореЗрдЯреНрд░реЛ рдореЗрдВ рдЙрдкрдЧреНрд░рд╣реЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ?
"рдХреНрдпреЛрдВ" рдХреЗ рд╕рд╛рде рдкрддрд╛ рд▓рдЧрд╛, "рдХреИрд╕реЗ" рдЬрд╛рдиреЗ ...
рддреНрд╡рд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд╣реАрдВ рдХрд╣реАрдВ SensorEventListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЕрднреА рддрдХ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рд╣рдо рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ
public abstract class Accelerometer implements SensorEventListener { protected float lastX; protected float lastY; protected float lastZ; public abstract Point getPoint(); public void onAccuracyChanged(Sensor arg0, int arg1) { } }
рдФрд░, рдЙрд╕реА рд╕рдордп, рд╕реЗрдВрд╕рд░
рдХрд╛рдЙрдВрдЯрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ:
public class Point { private float x = 0; private float y = 0; private float z = 0; private int cnt = 1; public float getX() { return x/(float)cnt; } public float getY() { return y/(float)cnt; } public float getZ() { return z/(float)cnt; } public Point(float x, float y, float z, int cnt) { this.x = x; this.y = y; this.z = z; this.cnt = cnt; } }
рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред SENSOR_DELAY_GAME рдореЛрдб рдореЗрдВ рд╕реЗрдВрд╕рд░ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд┐ рд▓рдЧрднрдЧ 20 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣реИред рдпрд╣ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рджреВрд╕рд░реА рдУрд░, рдХрдо рдмрд╛рд░ рд░реАрдбрд┐рдВрдЧ рд▓реЗрдиреЗ рд╕реЗ, рд╣рдо "рдЙрддреНрд╕рд░реНрдЬрди" рдореЗрдВ рдЧрд┐рд░рдиреЗ рдФрд░ рд╕рдЯреАрдХрддрд╛ рдЦреЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдФрд╕рдд рддреНрд╡рд░рдг рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдЖрдЦрд┐рд░реА рд╕реЗрдХрдВрдб рдореЗрдВред рд╕рд░рдгреА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдФрд░ рдФрд╕рдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдо dX, dY, dZ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рд╣рдорд╛рд░рд╛ рдЕрдВрд╢рд╛рдВрдХрди рдЬреЛ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
public class XYZAccelerometer extends Accelerometer { private static final int BUFFER_SIZE = 500;
рдЖрдкрдХреА рдЕрдиреБрдорддрд┐ рд╕реЗ, рдореИрдВ рд╕реЗрдВрд╕рд░ рдХреИрд▓рд┐рдмреНрд░реЗрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкрд╢реНрдЪрд╛рддрд╛рдк рдХреЛ рджреВрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдлрд┐рд░ рд╣рдорд╛рд░реЗ XYZ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд dX, dY, dZ рд╕реЗрдЯ рдХрд░реЗрдВред рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐
рдЬрдм рд╣рдо рд╕реЛрддреЗ рд╣реИрдВ , рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХрд╛ рддреНрд╡рд░рдг рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕реЗрдВрд╕рд░ рдЗрд╕реЗ рдорд╛рдкрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдЧрддрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
public class MeasurePoint { private float x; private float y; private float z; private float speedBefore; private float speedAfter; private float distance; private float acceleration; private long interval; public MeasurePoint(float x, float y, float z, float speedBefore, long interval) { this.x = x; this.y = y; this.z = z; this.speedBefore = speedBefore; this.interval = interval; speedAfter = 0; calc(); } private void calc(){
рдФрд░ рдкреВрд░реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ:
public class MeasureData {
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ ... рдЬреЛ, рд╡реИрд╕реЗ, рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рд▓реЗрдЖрдЙрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
<serviceLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <serviceButton android:id="@+id/btn" android:text="TEST" android:layout_width="300px" android:layout_height="200px" android:onClick="onButtonTest" /> <serviceTextView android:id = "@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=":" /> <service/LinearLayout>
рдФрд░ рдХреЛрдб:
public class TestActivity extends Activity { static final int TIMER_DONE = 2; static final int START = 3; private StartCatcher mStartListener; private XYZAccelerometer xyzAcc; private SensorManager mSensorManager; private static final long UPDATE_INTERVAL = 500; private static final long MEASURE_TIMES = 20; private Timer timer; private TextView tv; private Button testBtn; int counter; private MeasureData mdXYZ; Handler hRefresh = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case TIMER_DONE: onMeasureDone(); String es1 = Float.toString(Math.round(mdXYZ.getLastSpeedKm()*100)/100f); tv.append(" END SPEED " + es1 + " \n"); enableButtons(); break; case START: tv.append(" START"); timer = new Timer(); timer.scheduleAtFixedRate( new TimerTask() { public void run() { dumpSensor(); } }, 0, UPDATE_INTERVAL); break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.txt); testBtn = (Button) findViewById(R.id.btn); } @Override protected void onResume() { super.onResume(); tv.append("\n .."); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); setAccelerometer(); setStartCatcher(); mSensorManager.registerListener(xyzAcc, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { mSensorManager.unregisterListener(xyzAcc); super.onPause(); } public void onButtonTest(View v) { disableButtons(); mdXYZ = new MeasureData(UPDATE_INTERVAL); counter = 0; tv.setText(""); hRefresh.sendEmptyMessage(START); } void dumpSensor() { ++counter; mdXYZ.addPoint(xyzAcc.getPoint()); if (counter > MEASURE_TIMES) { timer.cancel(); hRefresh.sendEmptyMessage(TIMER_DONE); } } private void enableButtons() { testBtn.setEnabled(true); } private void setAccelerometer() { xyzAcc = new XYZAccelerometer(); mSensorManager.registerListener(xyzAcc, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); } private void disableButtons() { testBtn.setEnabled(false); } private void onMeasureDone() { mdXYZ.process(); } }
рд╡рд╣ рд╕рдм рд╣реИред рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдПрдХ рд╕рдкрд╛рдЯ рд░рд╛рд╕реНрддреЗ рдкрд░, рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдорд╛рдк рд╕рдЯреАрдХрддрд╛ рджреЗрддреА рд╣реИред
рдореИрдВ рдПрдХ рдкреНрд░рдпреЛрдЧ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╕рдВрд▓рдЧреНрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рдмреНрд▓реВ рд▓рд╛рдЗрди рдПрдХреНрд╕реАрд▓рд░реЛрдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЧрддрд┐ рд╣реИ, рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдЕрдзрд┐рдХрддрдо рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдЬреАрдкреАрдПрд╕ рд╕реЗ рд▓реА рдЧрдИ рдПрдХ рд╣реИред рдХрд╛рд▓рд╛ рдзрдмреНрдмрд╛ - рдкреНрд░рдпреЛрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдкреАрдбреЛрдореАрдЯрд░ рдкрд░ рдЧрддрд┐ред
