Android Sensors

سلسلة Android Sensors بالعربية الدرس الثانى : LightSensor

 

السلام عليكم .. اخوتي واخواتي المبرمجين العرب من كل مكان

قمت بالشرح فى الدرس السابق مقدمة بسيطة عن معني كلمة Sensor , وكيفية التعرف على ال Sensors المتوفرة فى جهازك المحمول للتعامل معها برمجيا

اما درسنا اليوم سوف نتطرق الى Sensor معين والتعامل معة برمجيا الا وهو Light Sensor وهو الحساس الذي يتحسس على شدة الاضائة الموجودة حول الجهاز

استخدام الحساس فى الاجهزة , ولماذا وفر المهندسين المصنعين للجهاز هذا ال Sensor فية 

انا لم ابحث عن سبب توفر هذا الحساس بالفعل داخل الجهاز ولكني لاحظت استخدام فعلي لهذا الحساس الا وهوا , تغير شدة اضائة الشاشة بتغير المكان لو لاحظت يوجد بعض اجهزة فى شدة الاضائة العالية ستجد ان الجهاز اوتوماتيك يقوم بتغير شدة اضائة الشاشة لكي يستطيع المستخدم رؤية الشاشة بوضوح فى الشمس والعكس صحيح . بالتاكيد تلك الاداة المستخدم هو من يقوم بتشغيلها حيث يجعل نظام التشغيل لة الحق فى التحكم فى شدة الاضاءة

بالتاكيد ليس هذا السبب الأساسي فى توفر هذا ال Sensor فى الجهاز ,, اطلق العنان لوقت فراغك وقم بالبحث عن هذا الموضوع

ولكن نحن كمبرمجين يوفر لنا نظام تشغيل الأندرويد اسخدام هذا الحساس كيفما نشاء فى تطبيقاتنا , لذا سوف اقوم بشرح تطبيق صغير لكيفية استخدام ال LightSensor والتعامل معة برمجيا.

 

الآن لننشىء تطبيق جديد سويا 

قم بانشاء مشروع جديد على Android Studio الخاص بك

قم بالتوجة الى ملف ال xml الخاص بال MainActivity 

وقم باضافة TextView لنعرض فية شدة الاضائة اثناء ال runtime

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.hendiware.basem.lightsensor.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="New Text"
        android:id="@+id/textView"
        android:textSize="25sp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

والآن نذهب الى ملف ال Manifest

لنقوم باضافة اشياء بسيطة فية وهي اضافة permission لتمكين بإستخدام ال Hardware الخاص بال Sensor هكذا

 

 <uses-feature android:name="android.hardware.sensor.light"
        android:required="true"/>

وهذا كود ال Manifeast كامل

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hendiware.basem.lightsensor">

    <uses-feature android:name="android.hardware.sensor.light"
        android:required="true"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

الآن اذهب معي الى ملف ال MainActivity لنبدأ فى البرمجة 

اولا قم بتعريف ال TextView وقم بربطة بملف التصميم

    TextView textView;
    ...
    textView = (TextView) findViewById(R.id.textView);

وايضا نقم بتعريف ال Sensor , SensorManager الذي تكلمنا عنهم فى الدرس السابق

وتلخيصهم بان SensorManager هو الذي يدير ال Sensors

و Sensor هو الذي يحدد نوع ال Sensor الذي سوف تستخدمة , فكما تلاحظ فى حالتنا قمنا بتحديد Sensor.TYPE_LIGHT

private SensorManager mSensorManager;
private Sensor mSensor;
..
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

بعد ان قمنا بتحديد نوع ال Sensor الذي سوف نستخدمة وهو Light Sensor الذي سيتحسس شدة الاضاءة

لذلك لا بد من عمل Event معين يقوم بتحسس  شدة الاضائة الموجودة في الجوار حول الموبايل

سوف نقوم بعمل Implement لـ Intrface الـ  SensorEventListener وهى عبارة عن انترفيس يتم استدعاء الـ Methods الخاصة بها عند تغير القيم الخاصة بسنسور معين .

public class MainActivity extends AppCompatActivity implements SensorEventListener {

لمعرفة الـ Methods الموجودة بهذا الـ Interface أو اى Interface أو Class أخر قم بالضغط على Ctrl وانت تشير بمؤشر الماوس لاسم الكلاس او الانترفيس وسوف يظهر الاسم على هيئة link قم بالضغط عليه سيقوم بفتح الـ Interface فى نافذه جديدة موضع بها محتوى الـ Interface وهنا فى الـ SensorEvent

سيقوم بتحويلك الى هذا ال Interface لنري بداخلة Two methods

 OnSensorChanged() هذه الميثود تستدعى عند تغير قيمة الـ Sensor  وفى مثالنا هذا تستدعى عند تغير شدة  الاضاءة واذا كنا نعمل على  سينسور الجاذبية مثلا فأنها تستدعى عند تغير قمية الجاذبية وهكذا ..
onAccuracyChanged() وهذه الMethod تستخدم عند تغير دقة الـ Sensor اثناء الاستخدام وهى تكون واحدة من التالى :

HIGH دقة عالية

MEDIUM دقة متوسطة

LOW دقة منخفضة
UNRELIABLE دقة غير موثوقة او اقل من المنخفضة ولا يمكن الاعتماد عليها

الآن قمت بالتعرف على SensorEventListener  جيدا قم بغلقه وعمل Implement لل methods الذي تحدثنا عنها وذلك عن طريق الوقوف على الخط الأحمر الذي ظهر امامك والضغط ctrl+enter ثم اختر Implement Methods سوف يختفي الخط الاحمر ويظهر الكود امامك  سليم الآن وليس بة أخطاء

 

 

بدء التقاط الـ Sensor 

لبدء التقاط الـ Sensor يجب علينا عمل registerListener وسوف نقوم بذلك فى onResume حتى يعمل السينسور عند بدء الاكتيتفيى وسيتم بدء التقاط الـ Sensor  عن طريق الميثود registerListener(); وهذه الميثود تأخذ عدة بارامترات لكن فى ابسط الأحوال وفى حالتنا هذه تأخذ ثلاثة بارامترز كالتالى :

@Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
    }

وهذه الـ Parameters كاالتالى :
الأول : هو الـ listener وفى حالتنا هذه هو  SensorEventListener وبما أننا قمنا بعمل implement له وللميثود الخاصة به فسنضع this  .

الثانى : وهو الـ Sensor الخاص بنا والذى اطلقنا عليه اسم mSensor بالأعلى .

الثالث : وهو الـ Sampling Period أى سرعة القياس الخاصة بالسينسور وهنا نحن نتحدث عن ارقام حساسة تصل للميكرو ثانية  (الثانية عباره عن مليون ميكرو ثانيه 😀 ) وقد يأخذ هذا البارامتر رقم بالميكرو ثانية أو قد يأخذ أحد الثوابت المعدة مسبقا وهى (SENSOR_DELAY_NORMAL, SENSOR_DELAY_UI, SENSOR_DELAY_GAME, or SENSOR_DELAY_FASTEST) الـ Normal هو العادى وهو مناسب لتغير اتجاه الشاشة ووضعها  والـ UI هو المناسب لواجهة المستخدم والـ GAME مناسب للإستشعار فى الالعاب والـ FASTEST تكون فيه سرعة قياس الـ Sensor أسرع ما يمكن .

 

ايقاف  الـتقاط الـ Sensor  

يجب عليك ايقاف التقاط الـ Sensor فور انتهاء مهمته لأنه فى حالة لم تقم بايقاف الـ Sensor فسيستمر فى أخذ مساحة من الـ Ram وفى استهلاك البطارية وموارد الجهاز حتى بعد إغلاق التطبيق  ! .

وفى حالتنا هذه نحتاج الـ Sensor فقط عند فتح التطبيق وعند اغلاق التطبيق وتوقف الـ Activity  ففى هذه الحالة لم نعد نحتاج الـ Sensor طبقا لما نشرحه فى هذا الدرس وبالتالى سنقوم بإغلاقه فى دالة onPause() عن طريق عمل unregister للـ Listener الذى يلتقط هذا الـ Sensor وبما أننا قمنا بعمل Implement فسنكتب this نشير بها الى الـ SensorEventListener .

 

 @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

الآن نذهب الى دالة ال OnSensorChanged()

نقوم بتعريف متغير String x لنخزن فيه قيمة شدة الإضائة الذي يرجعها لنا ال Sensor .
يوجد  مصفوفة تسمى  values داخل SensorEvent تحتوي على بيانات ال Sensor ومنها قيمة شدة الاضائة المخزنة فى values[0].

ونقوم باضافة السطر textView.setText ونقوم باعطائة x لنعرض فى ال TextView قيمة شدة الإضائة

    @Override
    public void onSensorChanged(SensorEvent event) {
        String x = "";
        x = String.valueOf(event.values[0]);
        textView.setText(x);
    }

عندما تقوم بالتشغيل الآن ستجد ان قيمة ال TextView تتغير بتغير شدة الاضائة وهذا ما يفعلة ال Light Sensor فانة يتحسس شدة الاضائة الموجودة بالغرفة .

 

كود ال MainActivity كامل 

package com.hendiware.basem.lightsensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager mSensorManager;
    private Sensor mSensor;
    boolean run = false;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        textView = (TextView) findViewById(R.id.textView);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        String x = "";
        x = String.valueOf(event.values[0]);
        textView.setText(x);
        
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
    }
}

الآن قم بتشغيل التطبيق والتجربة

null

وهذا ما حدث معي عند تجربة التطبيق وتسليط كشاف نحو الموبايل 😀

قم بالتجربة بنفسك وتجول فى الغرفة ولاحظ تغير شدة الإضاءة .

كما رأيت تطبيق بسيط .. أطلق  العنان لتفكيرك فى استخدام السيسنور الخاص بالاضاءة  فى تطبيقات مختلفة .

الآن انتهيت من شرح هذا الدرس

ارجو ان اكون وفقت فى شرحي لهذا الدرس , وانتظروني فى الدرس القادم سوف اتحدث عن accelerator sensor جهاز استشعار السرعة .

 

السابق
Android Webservices بالعربية – الدرس الخامس
التالي
Android Webservices بالعربية – الدرس السادس

6 تعليقات

أضف تعليقا

  1. ruoaa قال:

    رائع الحقيقه

    1. Basem Nasr قال:

      شكرا جزيلا أخي

  2. محمد قال:

    رائع جدا انا كنت ببذل مجهود رهيب علشان اعرف معلومه صغيره ومكانتش بالشرح الجميل ده بجد بشكركم جدا وربنا يوفقكم دائما

  3. nouras قال:

    أنا بحيك على الشرح الأكثر من رائع موفق :] وهتابع مواضيعكم لانه الشرح جديد ومبسط

  4. محمد محمد طه قال:

    شرح رائع

اترك تعليقاً

This site uses Akismet to reduce spam. Learn how your comment data is processed.