Lập trình di động - Bài 11: Làm việc với cảm biến (sensor)

pdf 26 trang vanle 4530
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình di động - Bài 11: Làm việc với cảm biến (sensor)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdflap_trinh_di_dong_bai_11_lam_viec_voi_cam_bien_sensor.pdf

Nội dung text: Lập trình di động - Bài 11: Làm việc với cảm biến (sensor)

  1. LẬP TRÌNH DI ĐỘNG Bài 11: làm việc với cảm biến (sensor)
  2. Nhắc lại bài trước . MediaStore: provider của android về các file đa phương tiện trên thiết bị . Các bước thực hiện việc ghi âm (và ghi hình) . Chơi file audio . Dịch vụ text-to-speech . 2 cách chơi video trong android: . VideoView kết hợp với MediaController . MediaPlayer kết hợp với SurfaceView . Dịch vụ camera: cho phép chụp ảnh, sử dụng intent có sẵn của hệ thống hoặc lập trình class Camera TRƯƠNG XUÂN NAM 2
  3. Nội dung 1. Sensor và SensorManager 2. Các loại sensor thông dụng 3. Các bước làm việc với sensor 4. Ví dụ: “la bàn” đơn giản 5. Kinh nghiệm làm việc với sensor TRƯƠNG XUÂN NAM 3
  4. Phần 1 Sensor và SensorManager TRƯƠNG XUÂN NAM 4
  5. Sensor và SensorManager . Sensor: chip cảm ứng nằm trong thiết bị, cung cấp dữ liệu mà nó đo đạc được cho hệ điều hành . Trong android, các sensor được quản lý chung bởi SensorManager, một dịch vụ hệ thống SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); . Thông qua SensorManager lập trình viên có thể: . Lấy danh sách các sensor có trong hệ thống hiện tại . Lấy đối tượng để làm việc trực tiếp với từng sensor . Đăng kí listener để xử lý sự kiện do các sensor báo về TRƯƠNG XUÂN NAM 5
  6. Sensor và SensorManager . Muốn lấy một sensor cụ thể, sử dụng phương thức getDefaultSensor(TYPE), tham số TYPE sẽ quy định kiểu đối tượng Sensor muốn lấy ra . Các loại sensor hiện được Android OS hỗ trợ (hằng số khai báo trong class Sensor): . TYPE_ACCELEROMETER: cảm biến gia tốc . TYPE_AMBIENT_TEMPERATURE: cảm biến nhiệt độ môi trường . TYPE_GRAVITY: cảm biến trọng lực . TYPE_GYROSCOPE: cảm biến con quay hồi chuyển . TYPE_LIGHT: cảm biến ánh sáng TRƯƠNG XUÂN NAM 6
  7. Sensor và SensorManager . Các loại sensor hiện được Android OS hỗ trợ (tiếp): . TYPE_HEART_RATE: cảm biến nhịp tim (mỗi phút) . TYPE_LINEAR_ACCELERATION: cảm biến gia tốc tuyến tính . TYPE_MAGNETIC_FIELD: cảm biến từ tính . TYPE_PRESSURE: cảm biến áp suất . TYPE_PROXIMITY: cảm biến khoảng cách gần . TYPE_RELATIVE_HUMIDITY: cảm biến độ ẩm . TYPE_ROTATION_VECTOR: cảm biến xoay . TYPE_GAME_ROTATION_VECTOR: cảm biến xoay 2D . TYPE_SIGNIFICANT_MOTION: cảm biến chuyển động TRƯƠNG XUÂN NAM 7
  8. Sensor và SensorManager public class SensorActivity extends Activity implements SensorEventListener { final SensorManager sm; final Sensor light; public SensorActivity() { sm = (SensorManager) getSystemService(SENSOR_SERVICE); light = sm.getDefaultSensor(Sensor.TYPE_LIGHT); } protected void onResume() { super.onResume(); sm.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL); } TRƯƠNG XUÂN NAM 8
  9. Sensor và SensorManager protected void onPause() { super.onPause(); sm.unregisterListener(this); } // khi độ chính xác của sensor thay đổi // UNRELIABLE LOW MEDIUM HIGH public void onAccuracyChanged(Sensor s, int accuracy) { } // khi thông số sensor cập nhật public void onSensorChanged(SensorEvent event) { } } TRƯƠNG XUÂN NAM 9
  10. Phần 2 Các loại sensor thông dụng TRƯƠNG XUÂN NAM 10
  11. Các loại sensor . Cảm biến trong Android chia làm 3 nhóm . Cảm biến chuyển động . Cảm biến vị trí . Cảm biến môi trường . Mỗi loại sensor có những đặc điểm vật lý khác nhau, muốn hiểu chính xác các chi tiết các sensor cần đọc tài liệu hướng dẫn (cần có kiến thức nhất định về vật lý và xử lý số liệu) . Một số sensor là loại virtual (ảo), tức là kết quả được tính toán hoặc nội suy từ nguồn khác TRƯƠNG XUÂN NAM 11
  12. Các loại sensor . Android SDK không có các class định sẵn cho từng loại sensor mà chỉ có TYPE của sensor, dữ liệu do sensor trả về là float (trường hợp cảm biến 1 đầu ra – chẳng hạn đo ánh sáng) hoặc float[] (trường hợp cảm biến nhiều đầu ra) . TYPE_AMBIENT_TEMPERATURE: cảm biến nhiệt độ, đơn vị đo là 0C . TYPE_LIGHT: cảm biến ánh sáng, đơn vị đo là lx . TYPE_PRESSURE: cảm biến áp suất không khí, đơn vị đo là mbar TRƯƠNG XUÂN NAM 12
  13. Các loại sensor . TYPE_PROXIMITY: cảm biến khoảng cách đến đối tượng, đơn vị đo là cm . TYPE_RELATIVE_HUMIDITY: cảm biến độ ẩm, đơn vị là % . TYPE_ACCELEROMETER / TYPE_GRAVITY: cảm biến gia tốc / hấp dẫn trong 3D(x,y,z), đơn vị m/s2 . TYPE_GYROSCOPE: cảm biến tốc độ góc quay trong 3D, đơn vị rad/s . TYPE_MAGNETIC_FIELD: cảm biến lực từ trong 3D, đơn vị là μT TRƯƠNG XUÂN NAM 13
  14. Phần 3 Các bước làm việc với sensor TRƯƠNG XUÂN NAM 14
  15. Các bước làm việc với sensor 1. Lấy SensorManager từ các dịch vụ hệ thống, thông qua getSystemService(Context.SENSOR_SERVICE) 2. Từ SensorManager lấy đối tượng Sensor điều khiển cảm biến cần sử dụng sensor = sensorService.getDefaultSensor(TYPE); 3. Cài đặt các bộ nghe (listener) phù hợp để xử lý các số liệu do cảm biến trả về 4. Tắt sensor trong những tình huống không cần thiết để tránh thiết bị tiêu tốn năng lượng 5. Xử lý lỗi hoặc thay đổi độ nhạy của thiết bị TRƯƠNG XUÂN NAM 15
  16. Phần 4 Ví dụ: “la bàn” đơn giản TRƯƠNG XUÂN NAM 16
  17. Ví dụ: “la bàn” đơn giản . “la bàn”: thiết bị định hướng 2D . Dùng cảm biến góc xoay (TYPE_ORIENTATION) . Cảm biến này hiện bị deprecated, bạn có phương án nào khác? . Viết một custom view (MyCompassView) để hiển thị la bàn đơn giản . Cập nhật dữ liệu mỗi khi nhận được phản hồi từ cảm biến . Hủy việc theo dõi cảm biến khi ứng dụng bị tạm ngưng (để tiết kiệm năng lượng) TRƯƠNG XUÂN NAM 17
  18. Ví dụ: La bàn đơn giản public class MainActivity extends Activity { private static SensorManager sensorService; private MyCompassView compass; private Sensor sensor = null; // kết thúc app: hủy đăng ký cảm biến (giúp hệ điều hành có thể // tắt cảm biến nếu cần) protected void onDestroy() { super.onDestroy(); if (sensor != null) sensorService.unregisterListener(mySensorEventListener); } TRƯƠNG XUÂN NAM 18
  19. Ví dụ: La bàn đơn giản // khởi tạo app: tạo giao diện + đăng ký lấy dữ liệu từ cảm biến protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); compass = new MyCompassView(this); setContentView(compass); sensorService = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorService.getDefaultSensor(Sensor.TYPE_ORIENTATION); if (sensor != null) sensorService.registerListener(mySensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL); else finish(); } TRƯƠNG XUÂN NAM 19
  20. Ví dụ: La bàn đơn giản // xử lý dữ liệu cảm biến gửi về: cập nhật hình ảnh la bàn private SensorEventListener mySensorEventListener = new SensorEventListener() { @Override public void onAccuracyChanged(Sensor s, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { compass.updateData(event.values[0]); } }; } TRƯƠNG XUÂN NAM 20
  21. Ví dụ: La bàn đơn giản public class MyCompassView extends View { private Paint area; private float arc = 0; // constructor public MyCompassView(Context context) { super(context); init(); } // vẽ lại la bàn với góc mới public void updateData(float position) { arc = position; invalidate(); } TRƯƠNG XUÂN NAM 21
  22. Ví dụ: La bàn đơn giản // vẽ lại hình ảnh la bàn ứng với số liệu mới protected void onDraw(Canvas c) { int xPoint = getMeasuredWidth() / 2; int yPoint = getMeasuredHeight() / 2; float radius = (float) (Math.max(xPoint, yPoint) * 0.6); c.drawCircle(xPoint, yPoint, radius, area); float x = (float) (xPoint + radius * Math.sin((double) (-arc) / 180 * Math.PI)); float y = (float) (yPoint – radius * Math.cos((double) (-arc) / 180 * Math.PI)); c.drawLine(xPoint, yPoint, x, y, area); c.drawText(String.valueOf(arc), xPoint, yPoint, area); } TRƯƠNG XUÂN NAM 22
  23. Ví dụ: La bàn đơn giản // hàm vẽ lại hình ảnh của view private void init() { area = new Paint(); area.setAntiAlias(true); area.setColor(Color.RED); area.setStrokeWidth(3); area.setStyle(Paint.Style.STROKE); area.setTextSize(30); } } TRƯƠNG XUÂN NAM 23
  24. Phần 5 Kinh nghiệm làm việc với sensor TRƯƠNG XUÂN NAM 24
  25. Kinh nghiệm làm việc với sensor . Nhất thiết phải giải phóng sensor khi không cần thiết, nếu không ứng dụng sẽ rất hao pin . Hệ thống không tự động tắt sensor kể cả khi tắt màn hình . Chú ý khi làm việc với các thông số 3D: các chiều có thể bị hoán đổi vị trí khi người sử dụng đặt thiết bị theo chiều âm (ví dụ: máy bị lật úp) . Nên kiểm thử trên thiết bị thật và hiệu chỉnh độ nhạy dần dần . Kết hợp nhiều sensor để thiết bị “nhạy cảm” hơn TRƯƠNG XUÂN NAM 25
  26. Kinh nghiệm làm việc với sensor TRƯƠNG XUÂN NAM 26