Wednesday, September 26, 2012

תכנות לאנדרואיד בקלות פרק 14 – עבודה מול Sensors

מכשיר האנדרואיד שלנו מציע לנו בתור מפתחים ובתור משתמשים מגוון רחב של חיישנים, אותם אנו יכולים לרתום לשימושנו, ולשלב באפליקציות על מנת להעשיר את חוויית השימוש ולהציע שימושיות ברמה מאוד גבוהה למשתמשים.
דוגמא לחיישנים :
אור, תנועה, שדה מגנטי, תאוצה, אוריינטציה, סוללה.. וכו..
דוגמא:
כרגיל אנו מדברים על Activity, שימו לב שישנו יישום של SensorListener ע"י: implements SensorListener
המתודה
onSensorChanged()
הינה זאת שנותנת לנו לדגום את השינויים ולהציג על המסך , למעשה אנו דוגמים את האוריינטציה של המכשיר בכל רגע נתון, וכמובן המתודה
 onAccuracyChanged()
 כותבת ללוג את השינויים ברמת הדיוק.
נקבל מופע של
SensorManager 
ע"י מערכת ההפעלה,
ונרצה לדגום כמה נתונים:
כאשר האפליקציה היא ב forground ולא ברקע, נרצה להרשם לשינויים בחיישנים אלה, כדאי לעשות את זה כאשר האפליקציה אינה ברקע על מנת לחסוך בסוללה, מכיוון שהאזנה לשינויים אלה צורכת משאבים לא מעטים. וכמובן נרצה לא להאזין לשינויים כאשר האפליקצייה ברקע בדיוק מאותם השיקולים.

public class SensorDemo extends Activity implements SensorListener {
private static final String TAG = "SensorDemo";
private SensorManager sensorManager;
private TextView outView;
private int sensor = SensorManager.SENSOR_ORIENTATION;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
outView = (TextView) findViewById(R.id.output);
// Real sensor manager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
/** Register for the updates when Activity is in foreground */
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
sensorManager.registerListener(this, sensor);
}
/** Stop the updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
sensorManager.unregisterListener(this, sensor);
}
public void onAccuracyChanged(int sensor, int accuracy) {
Log.d(TAG, String.format("onAccuracyChanged sensor: %d accuraccy: %d",
sensor, accuracy));
}
public void onSensorChanged(int sensorReporting, float[] values) {
if (sensorReporting != sensor)
return;
float azimuth = Math.round(values[0]);
float pitch = Math.round(values[1]);
float roll = Math.round(values[2]);
String out = String.format("Azimuth: %.2f\n\nPitch:%.2f\nRoll", azimuth,
pitch, roll);
Log.d(TAG, out);
outView.setText(out);
}
}

דוגמא נוספת הינה לשימוש בחיישן האור:
כאשר הרעיון הוא לגמרי אותו הרעיון, נקבל Instnace של SensorManager, נירשם אליו ב
 ()onResume וניפטר מהרישום עליו כאשר האפליקציה ברקע ב
onPause()
אננו ממשים את SensorListener ע"י מימוש של 2 המתודות מהדוגמא הקודמת:
onSensorChanged()
 ו –
onAccuracyChanged() 
ובדומה לדוגמא הקודמת אנו מדפיסים למסך של ה
Activity את הערכים שנמדדים מחיישן האור במכשיר.
הפעם יש לנו ProgressBar שבו אנו רואים את רמת האור שנמדדה במכשיר
public class AndroidLightSensorActivity extends Activity {
ProgressBar lightMeter;
TextView textMax, textReading;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        lightMeter = (ProgressBar)findViewById(R.id.lightmeter);
        textMax = (TextView)findViewById(R.id.max);
        textReading = (TextView)findViewById(R.id.reading);
        SensorManager sensorManager
        = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        Sensor lightSensor
        = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        if (lightSensor == null){
         Toast.makeText(AndroidLightSensorActivity.this,
           "No Light Sensor! quit-",
           Toast.LENGTH_LONG).show();
        }else{
         float max =  lightSensor.getMaximumRange();
         lightMeter.setMax((int)max);
         textMax.setText("Max Reading: " + String.valueOf(max));
         sensorManager.registerListener(lightSensorEventListener,
           lightSensor,
           SensorManager.SENSOR_DELAY_NORMAL);
        }
    }
    SensorEventListener lightSensorEventListener
    = new SensorEventListener(){
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
   // TODO Auto-generated method stub
  }
  @Override
  public void onSensorChanged(SensorEvent event) {
   // TODO Auto-generated method stub
   if(event.sensor.getType()==Sensor.TYPE_LIGHT){
    float currentReading = event.values[0];
    lightMeter.setProgress((int)currentReading);
    textReading.setText("Current Reading: " + String.valueOf(currentReading));
   }
  }
    };
}