Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

Khám phá sâu bộ cảm biến trên Android: Cảm biến tiệm cận và con quay hồi chuyển

by
Difficulty:IntermediateLength:MediumLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Tại sao lúc nào cũng bắt người dùng phải bấm các nút trên màn hình của họ? Bằng cách sử dụng một số các cảm biến phần cứng sẵn có trên các điện thoại Android tầm trung ngày nay, bạn có thể tạo ra ứng dụng cung cấp trải nghiệm người dùng hấp dẫn hơn.

Sensor Framework, là một phần của Android SDK, cho phép bạn đọc dữ liệu thô từ hầu hết các thiết bị cảm biến, chúng có thể là phần cứng hoặc phần mềm, một cách dễ dàng và nhất quán. Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách sử dụng Framework để đọc dữ liệu từ hai bộ cảm biến rất phổ biến: cảm biến tiệm cận và con quay hồi chuyển. Tôi cũng sẽ giới thiệu với bạn cảm biến véctơ xoay, một cảm biến hỗn hợp mà có thể, trong hầu hết trường hợp, đóng vai trò như là một sự thay thế dễ dàng và chính xác hơn cho con quay hồi chuyển.

Bạn có thể nắm được tổng quan về các thiết bị cảm biến của Android bằng cách đọc các hướng dẫn sau đây:

Yêu cầu

Để làm theo, bạn sẽ cần những thứ sau đây:

  • Một thiết bị Android với một cảm biến tiệm cận và một con quay hồi chuyển
  • Phiên bản mới nhất của Android Studio

1. Thiết lập dự án

Nếu ứng dụng của bạn chỉ đơn giản là không sử dụng được trên các thiết bị mà không có tất cả các cảm biến cần thiết, thì không nên được cài đặt trên các thiết bị như vậy. Bạn có thể cho phép Google Play và chợ ứng dụng khác biết về yêu cầu phần cứng của ứng dụng bằng cách thêm một hoặc nhiều thẻ <uses-feature> vào tập tin manifest của dự án trên Android Studio.

Ứng dụng mà chúng ta sẽ tạo ra trong hướng dẫn này sẽ không làm việc trên các thiết bị thiếu một cảm biến tiệm cận và một con quay hồi chuyển. Vì vậy, hãy thêm dòng sau vào tập tin manifest của bạn:

Tuy nhiên, lưu ý là bởi vì thẻ <uses-feature> sẽ không có tác dụng nếu người dùng cài đặt ứng dụng của bạn theo cách thủ công bằng cách sử dụng tập tin APK của nó, bạn vẫn phải lập trình để kiểm tra xem có một bộ cảm biến có sẵn hay không trước khi sử dụng nó.

2. Sử dụng cảm biến tiệm cận

Để tránh vô tình chạm vào màn hình, màn hình cảm ứng của điện thoại chuyển sang màu đen trong khi gọi, khi nó để rất gần với tai của bạn. Bạn có bao giờ tự hỏi làm thế nào điện thoại của bạn xác định nó có ở gần tai của bạn hay không? Vâng, nó sử dụng cảm biến tiệm cận, đó là một cảm biến có thể cho biết nếu một đối tượng ở gần với nó. Một số cảm biến tiệm cận cũng có thể cho biết khoảng cách các đối tượng là bao nhiêu, mặc dù khoảng cách tối đa thường chỉ khoảng 5 cm.

Bây giờ chúng ta hãy tạo ra một Activity, mà màu nền của nó chuyển sang đỏ mỗi khi bạn để bàn tay của bạn lên trên cảm biến tiệm cận trên điện thoại của bạn.

Bước 1: Truy cập vào cảm biến tiệm cận

Để truy cập vào bất kỳ cảm biến nào, bạn cần một đối tượng SensorManager. Để tạo ra nó, sử dụng phương thức getSystemService() của lớp Activity và truyền vào hằng số SENSOR_SERVICE cho nó.

Bây giờ, bạn có thể tạo ra một đối tượng Sensor cho cảm biến tiệm cận bằng cách gọi phương thức getDefaultSensor() và truyền hằng số TYPE_PROXIMITY vào nó.

Trước khi tiếp tục, hãy luôn luôn chắc chắn rằng đối tượng Sensor không phải là null. Nếu nó null, có nghĩa là cảm biến biến tiệm cận không tồn tại.

Bước 2: Đăng ký một Listener

Để có thể đọc các dữ liệu thô được tạo ra bởi một cảm biến, bạn phải kết hợp một SensorEventListener với nó bằng cách gọi phương thức registerListener() của đối tượng SensorManager. Trong khi làm điều đó, bạn cũng phải xác định mức độ thường xuyên mà các dữ liệu sẽ được đọc từ cảm biến.

Code sau đây đăng ký một Listener cho phép bạn đọc dữ liệu cảm biến tiệm cận một lần mỗi hai giây:

Tôi khuyên bạn hãy luôn luôn đăng ký Listener bên trong phương thức onResume() của Activity và huỷ đăng ký nó bên trong phương thức onPause(). Dưới đây là cách để bạn có thể huỷ đăng ký Listener:

Bước 3: Sử dụng dữ liệu thô

Đối tượng SensorEvent, tồn tại trong phương thức onSensorChanged(), có một mảng values chứa tất cả các dữ liệu thô, được tạo ra bởi các cảm biến gắn liền với nó. Trong trường hợp cảm biến tiệm cận, mảng chứa một giá trị duy nhất xác định khoảng cách giữa cảm biến và một đối tượng gần đó bằng đơn vị cm.

Nếu giá trị là tương đương với khoảng cách tối đa của cảm biến, thì ta có thể nói rằng không có gì ở gần nó. Ngược lại, nếu nó nhỏ hơn so với khoảng cách tối đa, điều đó có nghĩa là có một cái gì đó ở gần đó. Bạn có thể xác định khoảng cách tối đa của bất kỳ cảm biến bằng cách sử dụng phương thức getMaximumRange() của đối tượng Sensor có liên quan.

Để thật sự thay đổi màu nền của Activity dựa trên dữ liệu cảm biến tiệm cận, bạn có thể sử dụng phương thức setBackgroundColor() của View trong cửa sổ trên cùng.

Theo đó, thêm code sau đây vào trong phương thức onSensorChanged() mà bạn đã tạo ở bước trước:

Nếu bạn chạy ứng dụng ngay bây giờ và đặt bàn tay của bạn gần với mép trên của điện thoại, bạn sẽ thấy màn hình chuyển sang màu đỏ.

Background color changes when an object is detected nearby

3. Sử dụng con quay hồi chuyển

Con quay hồi chuyển cho phép bạn xác định vận tốc góc của một thiết bị Android bất kỳ lúc nào. Nói một cách đơn giản, nó sẽ cho bạn biết thiết bị xoay nhanh như thế nào xung quanh trục X, Y và Z của nó. Thậm chí gần đây các điện thoại giá rẻ đang được sản xuất cũng được tích hợp một con quay hồi chuyển bên trong, giúp tăng cường thực tế và các ứng dụng thực tế ảo trở nên rất phổ biến.

Bằng cách sử dụng con quay hồi chuyển, bạn có thể phát triển các ứng dụng mà có thể đáp ứng với những thay đổi hướng trên một thiết bị. Để tìm hiểu, chúng ta hãy tạo ra một Activity mà thay đổi nền thành màu xanh mỗi khi bạn xoay điện thoại theo hướng ngược chiều kim đồng hồ dọc theo trục Z, và ngược lại là màu vàng.

Bước 1: Truy cập cảm biến con quay hồi chuyển

Để tạo ra một đối tượng Sensor cho con quay hồi chuyển, tất cả những gì bạn cần làm là truyền hằng số TYPE_GYROSCOPE vào phương thức getDefaultSensor() của đối tượng SensorManager.

Bước 2: Đăng ký một Listener

Tạo một Listener cho cảm biến con quay hồi chuyển cũng không khác so với cho cảm biến tiệm cận. Tuy nhiên, khi đăng ký nó, bạn phải chắc chắn rằng tần số mẫu của nó là rất cao. Do đó, thay vì xác định một khoảng thời gian bằng miligiây, tôi đề nghị bạn sử dụng hằng số SENSOR_DELAY_NORMAL.

Bước 3: Sử dụng dữ liệu thô

Dữ liệu thô của cảm biến con quay hồi chuyển bao gồm ba giá trị float, xác định vận tốc góc của thiết bị dọc theo các trục X, Y, và Z. Đơn vị của mỗi giá trị là radian trên giây. Trong trường hợp xoay ngược chiều kim đồng hồ dọc theo trục bất kỳ, giá trị liên quan đến trục đó sẽ là dương. Trong trường hợp theo chiều kim đồng hồ, nó sẽ âm.

Bởi vì hiện chúng ta chỉ đang quan tâm đến xoay dọc theo trục Z, nên chúng ta sẽ chỉ làm việc với phần tử thứ ba trong mảng values của đối tượng SensorEvent. Nếu nó lớn hơn 0.5f, thì khoảng xoay đã đủ lớn, hãy chắc chắn xoay ngược chiều kim đồng hồ và thiết lập màu nền với màu xanh. Tương tự như vậy, nếu nó nhỏ hơn -0.5f, thì chúng ta có thể thiết lập màu nền vàng.

Nếu bạn chạy các ứng dụng ngay bây giờ, hãy giữ điện thoại nằm thẳng đứng và nghiêng sang bên trái, bạn sẽ thấy Activity biến thành màu xanh. Nếu bạn nghiêng nó ở hướng ngược lại, nó sẽ chuyển sang màu vàng.

Background color changes based on angular velocity

Tuy nhiên, nếu bạn xoay điện thoại quá nhiều, thì hướng màn hình của nó sẽ thay đổi thành nằm ngang và Activity của bạn sẽ khởi động lại. Để tránh tình trạng này, tôi đề nghị bạn thiết lập screenOrientation của Activity thành portrait trong tập tin manifest.

4. Sử dụng cảm biến véctơ xoay

Hầu hết các nhà phát triển ngày nay thích phần mềm hơn, các cảm biến hỗn hợp so với trên cảm biến phần cứng. Một cảm biến phần mềm kết hợp ở cấp độ thấp, dữ liệu thô từ nhiều cảm biến phần cứng để tạo ra dữ liệu mới mà không chỉ dễ dàng sử dụng, mà còn chính xác hơn. Cảm biến tiệm cận không có phần mềm thay thế. Tuy nhiên, con quay hồi chuyển thì có hai cái: cảm biến xoay vectơ trò chơi và cảm biến xoay vectơ. Trong hướng dẫn này, chúng ta sẽ chỉ tập trung vào cái thứ hai.

Trong ví dụ ở bước trước, chúng ta đã thay đổi màu nền của Activity mỗi khi vận tốc góc trên trục Z nhiều hơn 0.5 rad/s theo hướng cùng chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Tuy nhiên, làm việc với vận tốc góc, không trực quan lắm. Hơn nữa, chúng ta không có ý tưởng về góc thực tế của điện thoại là gì trước hoặc sau khi xoay.

Bằng cách sử dụng cảm biến véctơ xoay, chúng ta hãy tạo ra một Activity có màu nền thay đổi chỉ khi nó được xoay bởi một góc cụ thể. Ví dụ, chúng ta có thể biến nó thành màu vàng mỗi khi xoay nó—dọc theo trục Z—là hơn 45°, thành màu trắng khi xoay nó từ -10° đến 10° và màu xanh lam khi xoay nó là nhỏ hơn -45°.

Bước 1: Thiết lập cảm biến véc tơ xoay

Để có được cảm biến véctơ xoay, bạn phải truyền hằng số TYPE_ROTATION_VECTOR vào phương thức getDefaultSensor() của đối tượng SensorManager.

Làm việc với một cảm biến phần mềm cũng không khác so với làm việc với một cảm biến phần cứng. Vì vậy, bây giờ bạn phải kết hợp một Listener với cảm biến véctơ xoay để có thể đọc dữ liệu của nó. Một lần nữa, bạn có thể sử dụng hằng số SENSOR_DELAY_NORMAL cho khoảng thời gian.

Bước 2: Sử dụng dữ liệu

Cảm biến véctơ xoay kết hợp dữ liệu thô được tạo ra bởi con quay hồi chuyển, gia tốc và từ kế để tạo ra một cảm biến bốn trong một. Kết quả là, mảng values của đối tượng SensorEvent có năm yếu tố sau đây:

  • Bốn thành phần X, Y, Z và W trong một.
  • Một độ chính xác phụ

Bạn có thể chuyển đổi bộ cảm biến thành một ma trận xoay, 4x4, bằng cách sử dụng phương thức getRotationMatrixFromVector() của lớp SensorManager.

Nếu bạn đang phát triển một ứng dụng OpenGL, bạn có thể sử dụng ma trận quay trực tiếp để biến đổi các đối tượng trong cảnh 3D của bạn. Tuy nhiên, chúng ta hãy chuyển đổi ma trận xoay thành một mảng các hướng, xác định việc xoay của thiết bị dọc theo trục Z, X và Y. Để làm như vậy, chúng ta có thể sử dụng phương thức getOrientation() của lớp SensorManager.

Trước khi bạn gọi phương thức getOrientation(), bạn phải ánh xạ lại hệ tọa độ của ma trận xoay. Chính xác hơn, bạn phải xoay ma trận xoay chẳng hạn như Z của hệ toạ độ mới trùng với trục Y của hệ tọa độ ban đầu.

Mặc định, mảng orientations chứa góc bằng radian thay vì độ. Nếu bạn quen với radian, thoải mái sử dụng nó một cách trực tiếp. Nếu không, sử dụng các code sau đây để chuyển đổi tất cả các góc của nó thành độ:

Bây giờ, bạn có thể thay đổi màu nền của Activity dựa trên yếu tố thứ ba của mảng orientations.

Nếu bạn chạy ứng dụng ngay bây giờ, hãy giữ điện thoại ở chế độ thẳng đứng và nghiêng hơn 45° theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ, bạn sẽ thấy màu nền thay đổi.

Background color changes based on angle

Tổng kết

Trong hướng dẫn này, bạn đã biết cách sử dụng Sensor Framework của Android để tạo ra ứng dụng có thể đáp ứng dữ liệu được tạo ra bởi cảm biến tiệm cận và con quay hồi chuyển. Bạn cũng được học cách làm việc với cảm biến véctơ xoay, một lựa chọn phổ biến hơn so với con quay hồi chuyển. Hãy thoải mái sử dụng các cảm biến theo những cách sáng tạo. Lưu ý, các ứng dụng sử dụng các cảm biến không hiệu quả có thể rất hao pin của thiết bị.

Để tìm hiểu thêm về các cảm biến phần cứng và các dữ liệu mà chúng tạo ra, bạn có thể tham khảo tài liệu hướng dẫn Sensors API chính thức. Và kiểm tra một số nội dung về phần cứng và cảm biến khác của chúng tôi ở đây trên Envato Tuts+!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.