مشخصات مقاله
-
1771
-
0.0
-
4666
-
0
-
0
آموزش استفاده از Android Sensor Manager
پیاده سازی کلاس SensorManager و دسترسی به حسگرهای دستگاه اندروید
برای دسترسی به حسگرهای دستگاه اندروید می بایست نمونه ای از کلاس SensorManager را پیاده سازی نمایید. از جمله ی این حسگرها می توان به شتاب سنج یا accelerometer اشاره کرد. متاسفانه، امکان تست شتاب سنج و شبیه سازی آن در Android emulator وجود ندارد.
برای دسترسی به کلاس SensorManager کافی است متد getSystemService(SENSOR_SERVICE) را فراخوانی نمایید. کلاس Sensor ثوابت متعددی (constants) برای دسترسی به حسگرهای مختلف فراهم می آورد.
- Sensor.TYPE_GYROSCOPE
- Sensor.TYPE_MAGNETIC_FIELD
- Sensor.TYPE_ORIENTATION
- Sensor.TYPE_ACCELEROMETER
می توانید با فراخوانی متد sensorManager.getDefaultSensor() به حسگر مربوطه دسترسی داشته باشید. این متد نوع حسگر (sensor type) و میزان زمان غیرفعال بودن تا فراخوانی حسگر را که به عنوان ثابت در سطح کلاس SensorManager تعریف شده، به عنوان پارامتر می پذیرد.
گوش فرادهنده به تغییرات حسگر (Sensor listener)
پس از دسترسی به حسگر مربوطه، لازم است یک SensorEventListener برای آن تعریف نمایید. این listener به تغییرات مرتبط با حسگر (sensor) گوش می دهد و به محض رخداد تغییر در اطلاعات حسگر مورد نظر، از آن با خبر می شود.
به منظور جلوگیری از اتلاف باتری، می توانید listener خود را در متد onResume() اعلان و ثبت نموده و داخل متد onPause() از حالت مزبور خارج نمایید (deregister کنید).
آموزش استفاده ی کاربردی از حسگر Accelerometer
در این بخش یک اپلیکیشن خواهیم نوشت که در صورت تکان خوردن دستگاه، به صورت خودکار رنگ پس زمینه را تغییر می دهد. برای این منظور ابتدا یک پروژه ی اندرویدی و activityبه ترتیب به نام های de.vogella.android.sensor و SensorTestActivity ایجاد نمایید.
محتوای فایل layout خود را به صورت زیر ویرایش نمایید.
حال کد کلاس activity خود را به صورت زیر ویرایش نمایید.
package de.vogella.android.sensor;
import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
public class SensorTestActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
private boolean color = false;
private View view;
private long lastUpdate;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view = findViewById(R.id.textView);
view.setBackgroundColor(Color.GREEN);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
lastUpdate = System.currentTimeMillis();
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
getAccelerometer(event);
}
}
private void getAccelerometer(SensorEvent event) {
float[] values = event.values;
// Movement
float x = values[0];
float y = values[1];
float z = values[2];
float accelationSquareRoot = (x * x + y * y + z * z)
/ (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
long actualTime = event.timestamp;
if (accelationSquareRoot >= 2) //
{
if (actualTime - lastUpdate < 200) {
return;
}
lastUpdate = actualTime;
Toast.makeText(this, "Device was shuffed", Toast.LENGTH_SHORT)
.show();
if (color) {
view.setBackgroundColor(Color.GREEN);
} else {
view.setBackgroundColor(Color.RED);
}
color = !color;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
// register this class as a listener for the orientation and
// accelerometer sensors
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
// unregister listener
super.onPause();
sensorManager.unregisterListener(this);
}
}
آموزش کاربردی: ساخت یک قطب نما
یک پروژه و activity جدید اندرویدی به ترتیب به نام های de.vogella.android.sensor.compass و MainActivity ایجاد نمایید.
اکنون یک کلاس View با پیاده سازی اختصاصی به صورت زیر ایجاد کنید.
package de.vogella.android.sensor.compass;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class MyCompassView extends View {
private Paint paint;
private float position = 0;
public MyCompassView(Context context) {
super(context);
init();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(2);
paint.setTextSize(25);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.WHITE);
}
@Override
protected void onDraw(Canvas canvas) {
int xPoint = getMeasuredWidth() / 2;
int yPoint = getMeasuredHeight() / 2;
float radius = (float) (Math.max(xPoint, yPoint) * 0.6);
canvas.drawCircle(xPoint, yPoint, radius, paint);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);
// 3.143 is a good approximation for the circle
canvas.drawLine(
xPoint,
yPoint,
(float) (xPoint + radius
* Math.sin((double) (-position) / 180 * 3.143)),
(float) (yPoint - radius
* Math.cos((double) (-position) / 180 * 3.143)), paint);
canvas.drawText(String.valueOf(position), xPoint, yPoint, paint);
}
public void updateData(float position) {
this.position = position;
invalidate();
}
}
بدنه ی کلاس activity پروژه ی خود را به صورت زیر ویرایش کنید.
package de.vogella.android.sensor.compass;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends Activity {
private static SensorManager sensorService;
private MyCompassView compassView;
private Sensor sensor;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
compassView = new MyCompassView(this);
setContentView(compassView);
sensorService = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorService.getDefaultSensor(Sensor.TYPE_ORIENTATION);
if (sensor != null) {
sensorService.registerListener(mySensorEventListener, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
Log.i("Compass MainActivity", "Registerered for ORIENTATION Sensor");
} else {
Log.e("Compass MainActivity", "Registerered for ORIENTATION Sensor");
Toast.makeText(this, "ORIENTATION Sensor not found",
Toast.LENGTH_LONG).show();
finish();
}
}
private SensorEventListener mySensorEventListener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
// angle between the magnetic north direction
// 0=North, 90=East, 180=South, 270=West
float azimuth = event.values[0];
compassView.updateData(azimuth);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (sensor != null) {
sensorService.unregisterListener(mySensorEventListener);
}
}
}