میخوای وارد بازار کار بشی و محصولات خودت رو بفرشی همین الان ثبت نام کن
0

حسگرها در اندروید

برای دسترسی به حسگرهای دستگاه اندروید می بایست نمونه ای از کلاس 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 خود را به صورت زیر ویرایش نمایید.

 

<!--?xml version="1.0" encoding="utf-8" ?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<textview android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Shake to get a toast and to switch color">
</textview></linearlayout>

حال کد کلاس 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);
                // ۳٫۱۴۳ 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
                        // ۰=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);
                }
        }
}

امیدواریم آموزش استفاده از حسگرها در اندروید نیز برای شما مفید واقع شده باشد و ادامه آموزش برنامه نویسی اندروید رو دنبال کنید . برای مطالعه پست‌ها بیشتر ، ما را در مدرسه کدنویسی تلگرام  و یا در تی جوان اینستاگرام دنبال کنید.

نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.

 

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×

سلام کاربر عزیز

هر سوالی دارید در این بخش هستیم تا شما رو راهنمائی کنیم

روی لوگومون کلیک کنید

× چطور میتونم کمکتون کنم؟