פלטפורמת Android מספקת שני חיישנים שמאפשרים לכם לקבוע את המיקום של מכשיר: חיישן השדה הגיאומגנטי ומד התאוצה. פלטפורמת Android מספקת גם חיישן שמאפשר לקבוע את המרחק בין החלק הקדמי של המכשיר לבין אובייקט (החיישן הזה נקרא חיישן קירבה). החיישן של השדה הגיאומגנטי וחיישן הקרבה מבוססים על חומרה. רוב יצרני הטלפונים והטאבלטים כוללים חיישן של שדה גיאומגנטי. באופן דומה, יצרני טלפונים בדרך כלל כוללים חיישן קירבה כדי לקבוע מתי הטלפון מוחזק קרוב לפנים של המשתמש (לדוגמה, במהלך שיחת טלפון). כדי לקבוע את האוריינטציה של המכשיר, אפשר להשתמש בקריאות של מד התאוצה וחיישן השדה הגיאומגנטי של המכשיר.
הערה: חיישן הכיוון הוצא משימוש ב-Android 2.2 (רמת API 8), וסוג חיישן הכיוון הוצא משימוש ב-Android 4.4W (רמת API 20).
חיישני מיקום משמשים לקביעת המיקום הפיזי של המכשיר ביחס למערכת הייחוס העולמית. לדוגמה, אפשר להשתמש בחיישן השדה הגיאומגנטי בשילוב עם מד התאוצה כדי לקבוע את מיקום המכשיר ביחס לקוטב הצפוני המגנטי. אפשר גם להשתמש בחיישנים האלה כדי לקבוע את הכיוון של המכשיר במסגרת ההתייחסות של האפליקציה. חיישני מיקום לא משמשים בדרך כלל למעקב אחרי תנועה של המכשיר, כמו ניעור, הטיה או דחיפה (מידע נוסף זמין במאמר בנושא חיישני תנועה).
חיישן השדה הגיאומגנטי ומד התאוצה מחזירים מערכים רב-ממדיים של ערכי החיישן לכל SensorEvent. לדוגמה,
חיישן השדה הגיאומגנטי מספק ערכים של עוצמת השדה הגיאומגנטי לכל אחד משלושת צירי הקואורדינטות במהלך אירוע אחד של החיישן. באופן דומה, חיישן מד התאוצה מודד את התאוצה שמופעלת על המכשיר במהלך אירוע חיישן. מידע נוסף על מערכות הקואורדינטות שבהן משתמשים חיישנים זמין במאמר
מערכות קואורדינטות של חיישנים. חיישן הקרבה מספק ערך יחיד לכל אירוע של החיישן. בטבלה 1 מפורטים חיישני המיקום שנתמכים בפלטפורמת Android.
טבלה 1. חיישני מיקום שנתמכים בפלטפורמת Android.
| חיישן | נתוני אירועים מחיישנים | תיאור | יחידות מידה |
|---|---|---|---|
TYPE_GAME_ROTATION_VECTOR |
SensorEvent.values[0] |
רכיב וקטור הסיבוב לאורך ציר X (x * sin(θ/2)). | ללא יחידה |
SensorEvent.values[1] |
רכיב וקטור הסיבוב לאורך ציר Y (y * sin(θ/2)). | ||
SensorEvent.values[2] |
רכיב וקטור הסיבוב לאורך ציר Z (z * sin(θ/2)). | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR |
SensorEvent.values[0] |
רכיב וקטור הסיבוב לאורך ציר X (x * sin(θ/2)). | ללא יחידה |
SensorEvent.values[1] |
רכיב וקטור הסיבוב לאורך ציר Y (y * sin(θ/2)). | ||
SensorEvent.values[2] |
רכיב וקטור הסיבוב לאורך ציר Z (z * sin(θ/2)). | ||
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
עוצמת השדה הגיאומגנטי לאורך ציר X. | μT |
SensorEvent.values[1] |
עוצמת השדה הגיאומגנטי לאורך ציר Y. | ||
SensorEvent.values[2] |
עוצמת השדה הגיאומגנטי לאורך ציר Z. | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
עוצמת השדה הגיאומגנטי (בלי כיול של ברזל קשה) לאורך ציר X. | μT |
SensorEvent.values[1] |
עוצמת השדה הגיאומגנטי (בלי כיול של ברזל קשה) לאורך ציר Y. | ||
SensorEvent.values[2] |
עוצמת השדה הגיאומגנטי (בלי כיול של ברזל קשה) לאורך ציר Z. | ||
SensorEvent.values[3] |
הערכת הטיה של ברזל לאורך ציר X. | ||
SensorEvent.values[4] |
הערכת הטיה של ברזל לאורך ציר Y. | ||
SensorEvent.values[5] |
הערכת הטיה של ברזל לאורך ציר Z. | ||
TYPE_ORIENTATION1 |
SensorEvent.values[0] |
אזימוט (הזווית סביב ציר Z). | מעלות |
SensorEvent.values[1] |
זווית (סביב ציר X). | ||
SensorEvent.values[2] |
גלגול (זווית סביב ציר Y). | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
המרחק מהאובייקט.2 | ס"מ |
1 החיישן הזה הוצא משימוש ב-Android 2.2 (רמת API 8), והסוג הזה של החיישן הוצא משימוש ב-Android 4.4W (רמת API 20). מסגרת החיישנים מספקת שיטות חלופיות להשגת נתוני הכיוון של המכשיר, שמוסברות במאמר חישוב הכיוון של המכשיר.
2 חלק מחיישני הקירבה מספקים רק ערכים בינאריים שמייצגים קירבה ומרחק.
שימוש בחיישן וקטור הסיבוב של המשחק
חיישן וקטור הסיבוב של המשחק זהה לחיישן וקטור הסיבוב, אבל הוא לא משתמש בשדה הגיאומגנטי. לכן ציר ה-Y לא מצביע צפונה אלא לכיוון אחר. ההתייחסות הזו יכולה להיות מוסטת באותו סדר גודל כמו הסחף של הג'ירוסקופ סביב ציר Z.
חיישן וקטור הסיבוב של המשחק לא משתמש בשדה המגנטי, ולכן הסיבובים היחסיים מדויקים יותר ולא מושפעים משינויים בשדה המגנטי. אפשר להשתמש בחיישן הזה במשחק אם לא חשוב לכם לדעת איפה הצפון, והווקטור הרגיל של הסיבוב לא מתאים לצרכים שלכם כי הוא מסתמך על השדה המגנטי.
הקוד הבא מראה איך אפשר לקבל מופע של חיישן וקטור הסיבוב של המשחק שמוגדר כברירת מחדל:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
שימוש בחיישן וקטור הסיבוב הגיאומגנטי
חיישן וקטור הסיבוב הגיאומגנטי דומה לחיישן וקטור הסיבוב, אבל הוא לא משתמש בג'ירוסקופ. הדיוק של החיישן הזה נמוך יותר מהדיוק של חיישן וקטור הסיבוב הרגיל, אבל צריכת החשמל שלו נמוכה יותר. משתמשים בחיישן הזה רק אם רוצים לאסוף נתוני סיבוב ברקע בלי לצרוך יותר מדי סוללה. החיישן הזה שימושי במיוחד כשמשתמשים בו בשילוב עם אצווה.
הקוד הבא מראה איך אפשר לקבל מופע של חיישן וקטור הסיבוב הגיאומגנטי שמוגדר כברירת מחדל:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
חישוב הכיוון שאליו פונה המכשיר
חישוב האוריינטציה של המכשיר מאפשר לעקוב אחרי המיקום של המכשיר ביחס למערכת הייחוס של כדור הארץ (במיוחד, הקוטב הצפוני המגנטי). הקוד הבא מראה איך מחשבים את האוריינטציה של המכשיר:
Kotlin
private lateinit var sensorManager: SensorManager ... // Rotation matrix based on current readings from accelerometer and magnetometer. val rotationMatrix = FloatArray(9) SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading) // Express the updated rotation matrix as three orientation angles. val orientationAngles = FloatArray(3) SensorManager.getOrientation(rotationMatrix, orientationAngles)
Java
private SensorManager sensorManager; ... // Rotation matrix based on current readings from accelerometer and magnetometer. final float[] rotationMatrix = new float[9]; SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // Express the updated rotation matrix as three orientation angles. final float[] orientationAngles = new float[3]; SensorManager.getOrientation(rotationMatrix, orientationAngles);
המערכת מחשבת את זוויות הכיוון באמצעות חיישן השדה הגיאומגנטי של המכשיר בשילוב עם מד התאוצה של המכשיר. המערכת משתמשת בשני חיישני החומרה האלה כדי לספק נתונים לגבי שלושת זוויות הכיוון הבאות:
- אזימוט (מעלות הסיבוב סביב ציר -z). הזווית בין כיוון המצפן הנוכחי של המכשיר לבין הצפון המגנטי. אם הקצה העליון של המכשיר פונה צפונה, האזימוט הוא 0 מעלות. אם הקצה העליון פונה דרומה, האזימוט הוא 180 מעלות. באופן דומה, אם הקצה העליון פונה מזרחה, האזימוט הוא 90 מעלות, ואם הקצה העליון פונה מערבה, האזימוט הוא 270 מעלות.
- זווית הגובה (מעלות הסיבוב סביב ציר X). זו הזווית שבין מישור שמקביל למסך המכשיר לבין מישור שמקביל לקרקע. אם מחזיקים את המכשיר במקביל לקרקע כשהקצה התחתון הכי קרוב אליכם ומטים את הקצה העליון של המכשיר לכיוון הקרקע, זווית ההטיה הופכת לחיובית. הטיה בכיוון ההפוך – הזזת הקצה העליון של המכשיר מהקרקע – גורמת לזווית הגובה להיות שלילית. טווח הערכים הוא מ-90- מעלות עד 90 מעלות.
- גלגול (מעלות הסיבוב סביב ציר Y). זו הזווית שבין מישור שמאונך למסך המכשיר לבין מישור שמאונך לקרקע. אם מחזיקים את המכשיר במקביל לקרקע כשהקצה התחתון קרוב אליכם ומטים את הקצה השמאלי של המכשיר לכיוון הקרקע, זווית הגלגול הופכת לחיובית. הטיה בכיוון ההפוך – הזזת הקצה הימני של המכשיר לכיוון הקרקע – גורמת לזווית הגלגול להיות שלילית. טווח הערכים הוא -180 degrees to 180 degrees.
הערה: הגדרת הגלגול של החיישן השתנתה כדי לשקף את רוב ההטמעות במערכת האקולוגית של החיישנים הגיאוגרפיים.
הערה: הזוויות האלה מבוססות על מערכת קואורדינטות שונה מזו שמשמשת בתעופה (לצידוד, להטיה ולגלגול). במערכת התעופה, ציר ה-x עובר לאורך הצד הארוך של המטוס, מהזנב ועד האף.
חיישן הכיוון מפיק את הנתונים שלו על ידי עיבוד של נתוני החיישן הגולמיים ממד התאוצה ומחיישן השדה הגיאומגנטי. בגלל העיבוד הכבד שנדרש, רמת הדיוק של חיישן הכיוון יורדת. באופן ספציפי, החיישן הזה אמין רק כשזווית הגלגול היא 0. כתוצאה מכך, חיישן הכיוון הוצא משימוש ב-Android 2.2 (רמת API 8), וסוג חיישן הכיוון הוצא משימוש ב-Android 4.4W (רמת API 20).
במקום להשתמש בנתונים גולמיים מחיישן הכיוון, מומלץ להשתמש בשיטה getRotationMatrix() בשילוב עם השיטה getOrientation() כדי לחשב את ערכי הכיוון, כמו שמוצג בדוגמת הקוד הבאה. במסגרת התהליך הזה, אפשר להשתמש בשיטה remapCoordinateSystem() כדי לתרגם את ערכי הכיוון למסגרת ההתייחסות של האפליקציה.
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private val accelerometerReading = FloatArray(3) private val magnetometerReading = FloatArray(3) private val rotationMatrix = FloatArray(9) private val orientationAngles = FloatArray(3) public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } override fun onResume() { super.onResume() // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer -> sensorManager.registerListener( this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField -> sensorManager.registerListener( this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } } override fun onPause() { super.onPause() // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this) } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. override fun onSensorChanged(event: SensorEvent) { if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size) } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size) } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. fun updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix( rotationMatrix, null, accelerometerReading, magnetometerReading ) // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles) // "orientationAngles" now has up-to-date information. } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private final float[] accelerometerReading = new float[3]; private final float[] magnetometerReading = new float[3]; private final float[] rotationMatrix = new float[9]; private final float[] orientationAngles = new float[3]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } @Override protected void onResume() { super.onResume(); // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); if (magneticField != null) { sensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } } @Override protected void onPause() { super.onPause(); // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this); } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.length); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.length); } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. public void updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles); // "orientationAngles" now has up-to-date information. } }
בדרך כלל לא צריך לבצע עיבוד נתונים או סינון של זוויות האוריינטציה הגולמיות של המכשיר, מלבד תרגום של מערכת הקואורדינטות של החיישן למסגרת ההתייחסות של האפליקציה.
שימוש בחיישן השדה הגיאומגנטי
חיישן השדה הגיאומגנטי מאפשר לעקוב אחרי שינויים בשדה המגנטי של כדור הארץ. הקוד הבא מראה איך אפשר לקבל מופע של חיישן השדה הגיאומגנטי שמוגדר כברירת מחדל:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
הערה: אם האפליקציה מיועדת ל-Android 12 (רמת API 31) או לגרסה מתקדמת יותר, קצב השימוש בחיישן הזה מוגבל.
החיישן הזה מספק נתוני עוצמת שדה גולמיים (ב-μT) לכל אחד משלושת צירי הקואורדינטות.
בדרך כלל לא צריך להשתמש בחיישן הזה ישירות. במקום זאת, אפשר להשתמש בחיישן וקטור הסיבוב כדי לקבוע את תנועת הסיבוב הגולמית, או להשתמש במד התאוצה ובחיישן השדה הגיאומגנטי בשילוב עם שיטת getRotationMatrix() כדי לקבל את מטריצת הסיבוב ואת מטריצת הנטייה. לאחר מכן אפשר להשתמש במטריצות האלה עם השיטות getOrientation() ו-getInclination() כדי לקבל נתוני אזימוט ונטייה גיאומגנטית.
הערה: כשבודקים את האפליקציה, אפשר לשפר את רמת הדיוק של החיישן על ידי הנפת המכשיר בתנועת הספרה 8.
שימוש במגנטומטר לא מכויל
המדד של מגנטומטר לא מכויל דומה לחיישן השדה הגיאומגנטי, אבל לא מופעלת בו כיול של ברזל קשה בשדה המגנטי. הכיול של היצרן
והפיצוי על הטמפרטורה עדיין חלים על השדה המגנטי. המדד המגנטי הלא מכויל שימושי לטיפול בהערכות לא טובות של ברזל קשה. באופן כללי, הערך של geomagneticsensor_event.values[0] יהיה קרוב לערך של uncalibrated_magnetometer_event.values[0] -
uncalibrated_magnetometer_event.values[3]. כלומר,
calibrated_x ~= uncalibrated_x - bias_estimate_x
הערה: חיישנים לא מכוילים מספקים יותר תוצאות גולמיות ועשויים לכלול הטיה מסוימת, אבל המדידות שלהם מכילות פחות קפיצות מתיקונים שמוחלים באמצעות כיול. יכול להיות שחלק ממפתחי האפליקציות יעדיפו תוצאות שלא עברו כיול, כי הן חלקות ואמינות יותר. לדוגמה, אם אפליקציה מנסה לבצע מיזוג נתונים מהחיישנים בעצמה, הוספת כיולים עלולה לעוות את התוצאות.
בנוסף לשדה המגנטי, המגנטומטר הלא מכויל מספק גם את הטיית הברזל הקשה המשוערת בכל ציר. הקוד הבא מראה איך אפשר לקבל מופע של מגנטומטר לא מכויל שמוגדר כברירת מחדל:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
שימוש בחיישן הקרבה
חיישן הקרבה מאפשר לכם לקבוע את המרחק של אובייקט ממכשיר. הקוד הבא מראה איך אפשר לקבל מופע של חיישן הקרבה שמוגדר כברירת מחדל:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
חיישן הקרבה משמש בדרך כלל כדי לקבוע את המרחק בין הראש של אדם לבין הפנים של מכשיר נייד (לדוגמה, כשמשתמש מבצע או מקבל שיחת טלפון). רוב חיישני הקרבה מחזירים את המרחק המוחלט בסנטימטרים, אבל חלקם מחזירים רק ערכים של 'קרוב' ו'רחוק'.
הערה: בחלק מהדגמים של המכשירים, חיישן הקרבה ממוקם מתחת למסך. אם החיישן מופעל כשהמסך פועל, יכול להיות שתופיע נקודה מהבהבת על המסך.
הקוד הבא מראה איך להשתמש בחיישן הקרבה:
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var proximity: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val distance = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() proximity?.also { proximity -> sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL) } } override fun onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause() sensorManager.unregisterListener(this) } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor proximity; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
הערה: חלק מחיישני הקרבה מחזירים ערכים בינאריים שמייצגים 'קרוב' או 'רחוק'. במקרה כזה, בדרך כלל החיישן מדווח על ערך הטווח המקסימלי שלו במצב הרחוק
ועל ערך נמוך יותר במצב הקרוב. בדרך כלל, הערך הרחוק הוא ערך גדול מ-5 ס "מ, אבל הוא יכול להשתנות מחיישן לחיישן. אפשר לקבוע את הטווח המקסימלי של חיישן באמצעות השיטה getMaximumRange().