مشخصات مقاله
-
3276
-
0.0
-
7837
-
0
-
0
آموزش استفاده از sensor manager در اندروید
حسگر اندروید
در این فصل شما را با نحوه ی استفاده از sensor manager در اندروید آشنا می سازیم .
فهرست محتوا
1. Android Sensor
- آموزش SensorManager
- Sensor listener (گوش فراخوان های رخدادهای مربوط به حس گرها)
2. آموزش Accelerometer (شتاب سنج)
3. آموزش ساخت Compass (قطب نما)
Android Sensor
آموزش SensorManager
Android Sensor (حسگرها یا همان سنسورهای اندروید) با کمک SensorManager, از چندین سنسور متعدد پشتیبانی می کند. به عنوان نمونه می توان به شتاب سنج اشاره کرد . متاسفانه امکان تست شتاب سنج بر روی شبیه ساز وجود ندارد .
می توان به وسیله ی getSystemService(SENSOR_SERVICE) به SensorManager دسترسی پیدا کرد . کلاس Sensor با تعریف چندین ثابت (constant) قابلیت دستیابی به حس گر های مختلف را فراهم می آورد .
آموزش استفاده از Intent برای گرفتن یک عکس
در وهله ی اول یک پروژه ی جدید اندروید به نام de.vogella.android.imagepick ایجاد کنید . اکنون activity پروژه را ساخته و آن را ImagePickActivity نام گذاری کنید .
داخل طرح کلی (layout) activity یک ImageView با شناسه ی (ID) result بگنجانید . در مرحله ی بعد یک دکمه با خصوصیت (property) onClick اضافه کنید که به تابع onClick اشاره کند .
کلاس ImagePickActivity را به کد زیر اضافه کنید .
Sensor.TYPE_MAGNETIC_FIELD
Sensor.TYPE_ORIENTATION
Sensor.TYPE_ACCELEROMETER
Sensor listener (گوش فراخوان های رخدادهای مربوط به حس گرها)
پس از دستیابی به حسگر, می توان روی آن یک شئ SensorEventListener ثبت کرد . گوش فراخوان ذکر شده در صورت تغییر داده (چنانچه اطلاعات تغییر یافت), بلافاصله مطلع می گردد .
به منظور اجتناب از مصرف بی مورد باتری, می توانید گوش فراخوان خود را در متد onResume() ثبت کرده و آن را دوباره در تابع onPause() لغو ثبت (de-register) کنید .
آموزش Accelerometer (شتاب سنج)
یک برنامه می سازیم که رنگ پس زمینه را در صورت رخ دادن shuffle, تغییر می دهد . پروژه ی جدید de.vogella.android.sensor را ایجاد کرده و activity آن را 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);
}
}
آموزش ساخت Compass (قطب نما)
پروژه ی جدید این تمرین را de.vogella.android.sensor.compass نام گذاری کنید . سپس activity پروژه را ساخته و آن را 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();
}
}
در مرحله ی آخر کدنویسی (coding) 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);
}
}
}