פלטפורמת 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_ORIENTATION 1 |
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 מעלות עד 180 מעלות.
הערה: הגדרת הגלגול של החיישן השתנתה כדי לשקף את רוב ההטמעות במערכת האקולוגית של החיישנים הגיאוגרפיים.
הערה: הזוויות האלה מבוססות על מערכת קואורדינטות שונה מזו שמשמשת בתעופה (לגבי סבסוב, עלרוד וגלגול). במערכת התעופה, ציר ה-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()
כדי לקבל נתונים של אזימוט ושל נטייה גיאומגנטית.
הערה: כשבודקים את האפליקציה, אפשר לשפר את רמת הדיוק של החיישן על ידי הנפת המכשיר בתנועת שמונה.
שימוש במגנטומטר לא מכויל
המגנטומטר הלא מכויל דומה לחיישן השדה הגיאומגנטי, אבל לא מבוצע כיול של ברזל קשה בשדה המגנטי. כיול המפעל ופיצוי הטמפרטורה עדיין חלים על השדה המגנטי. המדד הזה שימושי לטיפול בהערכות לא טובות של ברזל קשה. באופן כללי, 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()
.