Làm chủ cảm biến của Android: phần cứng, phần mềm và đa chiều

Tác Giả: John Stephens
Ngày Sáng TạO: 26 Tháng MộT 2021
CậP NhậT Ngày Tháng: 2 Tháng BảY 2024
Anonim
Làm chủ cảm biến của Android: phần cứng, phần mềm và đa chiều - ỨNg DụNg
Làm chủ cảm biến của Android: phần cứng, phần mềm và đa chiều - ỨNg DụNg

NộI Dung


Ngày nay, hầu hết các thiết bị Android hiện đại đều bị loại bỏ với một loạt các cảm biến.

Bạn có thể sử dụng thông tin này theo nhiều cách khác nhau - cho dù đó là theo dõi mức độ ánh sáng để ứng dụng của bạn có thể tự động điều chỉnh độ sáng hoặc bảng màu của nó; cho phép người dùng tương tác với trò chơi di động của bạn bằng các cử chỉ như nghiêng thiết bị của họ; hoặc sử dụng cảm biến tiệm cận để tự động vô hiệu hóa các sự kiện chạm bất cứ khi nào người dùng giữ thiết bị của họ vào tai.

Trong bài viết này, chúng tôi sẽ tạo ra ba ứng dụng lấy dữ liệu ánh sáng, độ gần và chuyển động từ một loạt các cảm biến phần cứng và phần mềm. Chúng tôi cũng sẽ theo dõi các cảm biến Android này trong thời gian thực, vì vậy ứng dụng của bạn luôn có quyền truy cập vào thông tin mới nhất.


Đến cuối bài viết này, bạn sẽ biết cách trích xuất một phần dữ liệu từ một cảm biến Android và cách xử lý các cảm biến cung cấp dữ liệu của chúng dưới dạng một mảng nhiều chiều.

Tôi có thể sử dụng cảm biến Android nào?

Cảm biến Android có thể được chia thành các loại sau:

  • Cảm biến môi trường. Chúng đo các điều kiện môi trường, chẳng hạn như nhiệt độ không khí, áp suất, độ ẩm và mức độ ánh sáng xung quanh.

  • Cảm biến vị trí. Danh mục này bao gồm các cảm biến đo vị trí vật lý của thiết bị, như cảm biến tiệm cận và cảm biến từ trường địa từ.
    Cảm biến chuyển động. Những cảm biến này đo chuyển động của thiết bị, và bao gồm gia tốc kế, cảm biến trọng lực, con quay hồi chuyển và cảm biến vectơ quay.

Ngoài ra, các cảm biến có thể là:


  • Phần cứng dựa. Đây là các thành phần vật lý được tích hợp vào thiết bị và đo trực tiếp các thuộc tính cụ thể, chẳng hạn như gia tốc hoặc cường độ của các trường địa từ xung quanh.
  • Phần mềm dựa trên, đôi khi được gọi là cảm biến ảo hoặc cảm biến tổng hợp. Chúng thường đối chiếu dữ liệu từ nhiều cảm biến dựa trên phần cứng. Đến cuối bài viết này, chúng tôi sẽ làm việc với cảm biến vectơ xoay, đây là cảm biến phần mềm kết hợp dữ liệu từ thiết bị đo gia tốc kế, từ kế và con quay hồi chuyển của thiết bị.

Cảm biến môi trường: Đo ánh sáng xung quanh

Cảm biến ánh sáng Android Khác đo ánh sáng xung quanh trong các đơn vị lux lux, đó là cường độ ánh sáng theo cảm nhận của mắt người. Giá trị lux được báo cáo bởi một cảm biến có thể khác nhau giữa các thiết bị, vì vậy nếu ứng dụng của bạn yêu cầu các giá trị nhất quán thì bạn có thể cần phải thao tác dữ liệu thô trước khi sử dụng nó trong ứng dụng của mình.

Trong phần này, chúng tôi sẽ tạo ra một ứng dụng lấy giá trị lux hiện tại từ cảm biến ánh sáng của thiết bị, hiển thị nó trong TextView và sau đó cập nhật TextView khi có dữ liệu mới.Sau đó, bạn có thể sử dụng thông tin này trong một loạt các ứng dụng, ví dụ bạn có thể tạo một ứng dụng đèn pin lấy thông tin từ cảm biến ánh sáng và sau đó tự động điều chỉnh cường độ của chùm tia dựa trên mức độ ánh sáng hiện tại.

Tạo một dự án Android mới với các cài đặt bạn chọn và hãy để bắt đầu!

Hiển thị dữ liệu cảm biến của bạn

Tôi sẽ thêm một TextView mà cuối cùng sẽ hiển thị dữ liệu mà chúng tôi đã trích xuất từ ​​cảm biến ánh sáng. TextView này sẽ cập nhật bất cứ khi nào có dữ liệu mới, vì vậy người dùng luôn có quyền truy cập vào thông tin mới nhất.

Mở tệp dự án của bạn Activity Activity_main.xml và thêm vào như sau:

Tiếp theo, chúng ta cần tạo tài nguyên chuỗi của light light Lightensens mà mà Tham chiếu trong bố cục của chúng tôi. Mở tệp tin chuỗi String dự án của bạn và thêm vào như sau:

Cảm biến ánh sáng:% 1 $ .2f

Phần mềm% 1 $ .2f là một trình giữ chỗ chỉ định thông tin chúng tôi muốn hiển thị và cách định dạng thông tin:

  • %1. Bạn có thể chèn nhiều chỗ dành sẵn vào cùng một tài nguyên chuỗi; %% 1 chỉ ra rằng chúng tôi sử dụng một trình giữ chỗ duy nhất.
  • $.2. Điều này xác định cách ứng dụng của chúng ta định dạng từng giá trị dấu phẩy động đến. Giá trị $ .2 chỉ ra rằng giá trị phải được làm tròn đến hai chữ số thập phân.
  • F. Định dạng giá trị dưới dạng số dấu phẩy động.

Mặc dù một số cảm biến phổ biến hơn các cảm biến khác, bạn không bao giờ nên cho rằng mọi thiết bị đều có quyền truy cập vào cùng một phần cứng và phần mềm. Tính khả dụng của cảm biến thậm chí có thể khác nhau giữa các phiên bản Android khác nhau, như một số cảm biến được giới thiệu cho đến khi phát hành nền tảng Android sau này.

Bạn có thể kiểm tra xem một cảm biến cụ thể có trên thiết bị hay không, sử dụng khung cảm biến Android. Sau đó, bạn có thể vô hiệu hóa hoặc kích hoạt các bộ phận của ứng dụng dựa trên tính khả dụng của cảm biến hoặc bạn có thể hiển thị giải thích rằng một số tính năng của ứng dụng của bạn đã giành chiến thắng như mong đợi.

Trong khi chúng tôi mở tệp tin String.xml của chúng tôi, hãy để tạo một chuỗi no noensensens, mà chúng tôi sẽ hiển thị nếu cảm biến ánh sáng không có sẵn:

Không có cảm biến ánh sáng có sẵn

Nếu ứng dụng của bạn không thể cung cấp trải nghiệm người dùng tốt mà không có quyền truy cập vào một cảm biến cụ thể, thì bạn cần thêm thông tin này vào Bản kê khai của mình. Ví dụ: nếu ứng dụng của bạn yêu cầu quyền truy cập vào cảm biến la bàn, thì bạn có thể sử dụng như sau:

Giờ đây, ứng dụng của bạn chỉ có thể được tải xuống các thiết bị có cảm biến la bàn.

Mặc dù điều này có thể giới hạn đối tượng của bạn, nhưng nó lại gây hại ít hơn nhiều so với việc cho phép ai đó tải xuống ứng dụng của bạn khi họ đảm bảo để có trải nghiệm không tốt, do cấu hình cảm biến của thiết bị của họ.

Giao tiếp với một bộ cảm biến: Bộ điều khiển cảm biến, Bộ cảm biến và người nghe

Để giao tiếp với cảm biến ánh sáng của thiết bị, bạn cần hoàn thành các bước sau:

1. Lấy một phiên bản của Trình quản lý cảm biến

Bộ điều khiển cảm biến cung cấp tất cả các phương thức bạn cần để truy cập đầy đủ các bộ cảm biến.

Để bắt đầu, hãy tạo một biến màllll giữ một thể hiện của Trình quản lý cảm biến:

cảm biến riêng Trình quản lý ánh sángSensorManager;

Sau đó, bạn cần lấy một phiên bản của Trình quản lý cảm biến, bằng cách gọi phương thức Context.getSystemService và truyền vào đối số Context.SENSOR_SERVICE:

lightSensorManager = (Bộ cảm biến) getSystemService (Context.SENSOR_SERVICE);

2. Tham chiếu đến lightTextView

Tiếp theo, chúng ta cần tạo một biến thành viên riêng mà màll sẽ giữ các đối tượng TextView của chúng ta và gán nó cho TextView của chúng ta:

TextView riêng tư lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. Kiểm tra xem cảm biến có tồn tại trên thiết bị hiện tại không

Bạn có thể có quyền truy cập vào một cảm biến cụ thể bằng cách gọi phương thức getDefaultSensor (), sau đó chuyển qua cảm biến đó. Hằng số loại cho cảm biến ánh sáng là TYPE_LIGHT, vì vậy chúng ta cần sử dụng như sau:

lightSensor = lightSensorManager.getDefaultSensor (Cảm biến.TYPE_LIGHT);

Nếu cảm biến không tồn tại trên thiết bị này, thì phương thức getDefaultSensor () sẽ trả về null và chúng tôi sẽ hiển thị chuỗi no no noensensens:

Chuỗi cảm biến_error = getResource (). GetString (R.opes.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }}

4. Đăng ký người nghe cảm biến của bạn

Mỗi khi một cảm biến có dữ liệu mới, Android sẽ tạo ra một đối tượng SensorEvent. Đối tượng SensorEvent này bao gồm cảm biến tạo ra sự kiện, dấu thời gian và giá trị dữ liệu mới.

Ban đầu, chúng tôi sẽ tập trung vào các cảm biến ánh sáng và độ gần, trả về một phần dữ liệu duy nhất. Tuy nhiên, một số cảm biến cung cấp các mảng đa chiều cho mỗi SensorEvent, bao gồm cảm biến vectơ xoay, mà chúng tôi sẽ khám phá đến cuối bài viết này.

Để đảm bảo ứng dụng của chúng tôi được thông báo về các đối tượng SensorEvent này, chúng tôi cần phải đăng ký một trình lắng nghe cho sự kiện cảm biến cụ thể đó, bằng cách sử dụng registerListener ().

Phương thức registerListener () nhận các đối số sau:

  • Một ứng dụng hoặc Bối cảnh hoạt động.
  • Loại cảm biến mà bạn muốn theo dõi.
  • Tốc độ mà cảm biến sẽ gửi dữ liệu mới. Tốc độ cao hơn sẽ cung cấp cho ứng dụng của bạn nhiều dữ liệu hơn, nhưng nó cũng sẽ sử dụng nhiều tài nguyên hệ thống hơn, đặc biệt là thời lượng pin. Để giúp bảo quản pin của thiết bị, bạn nên yêu cầu lượng dữ liệu tối thiểu mà ứng dụng của bạn yêu cầu. Tôi sẽ sử dụng SensorManager.SENSOR_DELAY_NORMAL, nó sẽ gửi dữ liệu mới cứ sau 200.000 micro giây (0,2 giây).

Vì việc nghe cảm biến làm cạn kiệt pin của thiết bị, bạn không bao giờ nên đăng ký người nghe trong phương thức ứng dụng của bạn, vì điều này sẽ khiến các cảm biến tiếp tục gửi dữ liệu, ngay cả khi ứng dụng của bạn ở chế độ nền.

Thay vào đó, bạn nên đăng ký các cảm biến của mình trong phương thức vòng đời của ứng dụng nhánh onStart ():

@Override được bảo vệ void onStart () {super.onStart (); // Nếu cảm biến khả dụng trên thiết bị hiện tại ... // if (lightSensor! = Null) {// Khăn.then bắt đầu nghe // lightSensorManager.registerListener (this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Thực hiện các cuộc gọi lại SensorEventListener

SensorEventListener là một giao diện nhận thông báo từ Bộ điều khiển cảm biến
Bất cứ khi nào có dữ liệu mới, hoặc độ chính xác của cảm biến thay đổi.

Bước đầu tiên, là sửa đổi chữ ký lớp của chúng tôi để thực hiện giao diện SensorEventListener:

lớp công khai MainActivity mở rộng AppCompatActivity thực hiện SensorEventListener {

Sau đó chúng ta cần thực hiện các phương thức gọi lại sau:

onSensorChanged ()

Phương pháp này được gọi để đáp ứng với mỗi SensorEvent mới.

Dữ liệu cảm biến thường có thể thay đổi nhanh chóng, vì vậy ứng dụng của bạn có thể đang gọi phương thức onSensorChanged () một cách thường xuyên. Để giúp ứng dụng của bạn chạy trơn tru, bạn nên thực hiện càng ít công việc càng tốt bên trong phương thức onSensorChanged ().

@Override void công khai onSensorChanged (SensorEvent sensorEvent) {// Để làm //}

onAccuracyChanged ()

Nếu độ chính xác của cảm biến cải thiện hoặc giảm, thì Android sẽ gọi phương thức onAccuracyChanged () và chuyển cho nó một đối tượng Cảm biến chứa giá trị độ chính xác mới, chẳng hạn như SENSOR_STATUS_UNRELIABLE hoặc SENSOR_STATUS_ACCURACY_HIGH.

Cảm biến ánh sáng không báo cáo độ chính xác thay đổi, vì vậy tôi sẽ bỏ trống cuộc gọi lại onAccuracyChanged ():

@Override void công khai onAccuracyChanged (Cảm biến cảm biến, int i) {// Để làm //}}

6. Lấy giá trị cảm biến

Bất cứ khi nào chúng ta có một giá trị mới, chúng ta cần gọi phương thức onSensorChanged () và truy xuất chuỗi ánh sáng light_sensor. Sau đó, chúng tôi có thể ghi đè chuỗi văn bản giữ chỗ của chuỗi (% 1 $ .2f) và hiển thị chuỗi được cập nhật như một phần của TextView của chúng tôi:

@Override void công khai onSensorChanged (SensorEvent sensorEvent) {// Cảm biến Giá trị hiện tại cảm biến // float currentValue = sensorEvent.values; // Truy xuất chuỗi light lightensensens, chèn giá trị mới và hiển thị nó cho người dùng // lightTextView.setText (getResource (). GetString (R.opes.light_sensor, currentValue)); }

7. Hủy đăng ký người nghe của bạn

Các cảm biến có thể tạo ra một lượng lớn dữ liệu trong một khoảng thời gian nhỏ, vì vậy để giúp bảo vệ thiết bị Tài nguyên của bạn, bạn sẽ cần hủy đăng ký người nghe khi chúng không còn cần thiết nữa.

Để dừng nghe các sự kiện cảm biến khi ứng dụng của bạn ở chế độ nền, hãy thêm unregisterListener () vào phương thức vòng đời dự án của bạn onStop ():

@Override được bảo vệ void onStop () {super.onStop (); lightSensorManager.unregisterListener (cái này); }

Lưu ý rằng bạn không nên hủy đăng ký trình nghe của mình trong onPause (), vì trong Android 7.0 và các ứng dụng cao hơn có thể chạy ở chế độ chia đôi màn hình và hình ảnh, trong đó chúng ở trạng thái tạm dừng, nhưng vẫn hiển thị trên màn hình.

Sử dụng cảm biến ánh sáng Android, đã hoàn thành mã

Sau khi hoàn thành tất cả các bước trên, dự án MainActivity của dự án của bạn sẽ trông giống như thế này:

nhập android.support.v7.app.AppCompatActivity; nhập android.os.Bundle; nhập android.content.Context; nhập android.hardware.Sensor; nhập android.hardware.SensorEvent; nhập android.hardware.SensorEventListener; nhập android.hardware.SensorManager; nhập android.widget.TextView; lớp công khai MainActivity mở rộng AppCompatActivity // Thực hiện giao diện SensorEventListener // thực hiện SensorEventListener {// Tạo các biến của bạn // private Sensor lightSensor; cảm biến riêng Trình quản lý ánh sángSensorManager; TextView riêng tư lightTextView; @Override void void onCreate (Gói đã lưuInstanceState) {super.onCreate (yetInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // Lấy một phiên bản của SensorManager // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Kiểm tra cảm biến ánh sáng // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Nếu cảm biến ánh sáng không tồn tại, thì sẽ hiển thị lỗi // Chuỗi sensor_error = getResource (). GetString (R.opes.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @Override void void onStart () {super.onStart (); // Nếu cảm biến có sẵn trên thiết bị hiện tại ... // if (lightSensor! = Null) {// Khăn.then đăng ký một trình nghe // lightSensorManager.registerListener (this, lightSensor, // Chỉ định tần suất bạn muốn nhận dữ liệu mới // SensorManager.SENSOR_DELAY_NORMAL); }} @Override void void onStop () {super.onStop (); // Hủy đăng ký trình nghe của bạn // lightSensorManager.unregisterListener (this); } @Override void công khai onSensorChanged (SensorEvent sensorEvent) {// Cảm biến Giá trị hiện tại cảm biến // float currentValue = sensorEvent.values; // Truy xuất chuỗi light lightensensens, chèn giá trị mới và cập nhật TextView // lightTextView.setText (getResource (). GetString (R.opes.light_sensor, currentValue)); } @Override // Nếu cảm biến Độ chính xác của cảm biến Thay đổi độ chính xác .// Khoảng trống công khai trênAccuracyChanged (Cảm biến cảm biến, int i) {// TO DO //}}

Kiểm tra ứng dụng cảm biến Android đã hoàn thành của bạn

Để kiểm tra ứng dụng này trên điện thoại thông minh hoặc máy tính bảng Android vật lý:

  • Cài đặt dự án trên thiết bị của bạn (bằng cách chọn Chạy Run> Chạy run từ thanh công cụ Android Studio).
  • Mặc dù khác nhau giữa các thiết bị, cảm biến ánh sáng thường nằm ở phía trên bên phải màn hình. Để thao tác với các mức độ ánh sáng, hãy di chuyển thiết bị của bạn đến gần hơn và sau đó cách xa nguồn sáng hơn. Ngoài ra, bạn có thể thử che thiết bị bằng tay để chặn ánh sáng. Giá trị cảm biến ánh sáng của cải nên giá trị tăng và giảm, tùy thuộc vào lượng ánh sáng có sẵn.

Nếu bạn sử dụng Thiết bị ảo Android (AVD), thì trình giả lập có một bộ điều khiển cảm biến ảo mà bạn có thể sử dụng để mô phỏng các sự kiện cảm biến khác nhau. Bạn truy cập vào các điều khiển cảm biến ảo này, thông qua cửa sổ Trình giả lập điều khiển Mở rộng Điều khiển mở rộng:

  • Cài đặt ứng dụng trên AVD của bạn.
  • Bên cạnh AVD, bạn sẽ thấy một dải nút. Tìm nút Ba chấm nhiều điểm khác nhau (nơi con trỏ được định vị trong ảnh chụp màn hình sau) và nhấp chuột. Điều này sẽ khởi chạy cửa sổ điều khiển mở rộng trên phạm vi điều khiển.

  • Trong menu bên trái, chọn các cảm biến ảo.
  • Chọn các thẻ cảm biến bổ sung khác. Tab này chứa các thanh trượt khác nhau mà bạn có thể sử dụng để mô phỏng các sự kiện cảm biến môi trường và vị trí khác nhau.

  • Tìm thanh trượt của Light Light (lux) và kéo nó sang trái và phải, để thay đổi mức độ ánh sáng mô phỏng. Ứng dụng của bạn sẽ hiển thị các giá trị thay đổi này, trong thời gian thực.

Bạn có thể tải về dự án đã hoàn thành từ GitHub.

Đo khoảng cách, với cảm biến độ gần Android Android

Bây giờ chúng tôi đã thấy cách lấy thông tin từ một cảm biến môi trường, hãy để xem cách bạn áp dụng kiến ​​thức này vào Chức vụ cảm biến.

Trong phần này, chúng tôi sẽ sử dụng cảm biến tiệm cận của thiết bị để theo dõi khoảng cách giữa điện thoại thông minh hoặc máy tính bảng của bạn và các đối tượng khác. Nếu ứng dụng của bạn có bất kỳ loại chức năng giọng nói nào, thì cảm biến độ gần có thể giúp bạn xác định khi nào điện thoại thông minh được giữ cho tai người dùng, ví dụ như khi họ có cuộc trò chuyện qua điện thoại. Sau đó, bạn có thể sử dụng thông tin này để vô hiệu hóa các sự kiện chạm, do đó, người dùng không vô tình cúp máy hoặc kích hoạt các sự kiện không mong muốn khác giữa cuộc hội thoại.

Tạo giao diện người dùng

Tôi sẽ hiển thị dữ liệu gần trên màn hình, vì vậy bạn có thể xem nó cập nhật theo thời gian thực. Để giúp mọi thứ đơn giản, hãy để sử dụng lại nhiều cách bố trí từ ứng dụng trước của chúng tôi:

Tiếp theo, hãy mở tập tin String.xml của bạn và tạo ra một chuỗi lân cận vùng lân cận. Một lần nữa, chuỗi này cần chứa một trình giữ chỗ, cuối cùng sẽ được điền bởi dữ liệu được trích xuất từ ​​cảm biến tiệm cận:

Cảm biến tiệm cận Cảm biến tiệm cận:% 1 $ .2f Không có cảm biến tiệm cận

Lấy dữ liệu từ cảm biến tiệm cận

Tương tự như cảm biến ánh sáng, cảm biến tiệm cận Android, trả về một giá trị dữ liệu duy nhất, có nghĩa là chúng ta có thể sử dụng lại nhiều mã từ ứng dụng trước đó. Tuy nhiên, có một vài khác biệt lớn, cộng với một số thay đổi liên quan đến tên giúp mã này dễ theo dõi hơn:

  • Tạo một phiên bản của Trình quản lý cảm biến, trong khoảng thời gian này, tôi sẽ đặt tên là gần kềSensorManager.
  • Có được một ví dụ về vùng lân cận gầnSensorManager.
  • Tạo một tham chiếu đến vùng lân cận vùng lân cận.
  • Gọi phương thức getDefaultSensor () và truyền cho nó cảm biến TYPE_PROXIMITY.
  • Đăng ký và hủy đăng ký người nghe cho cảm biến tiệm cận.

Sau khi thực hiện các chỉnh sửa này, bạn nên kết thúc với những điều sau đây:

nhập android.support.v7.app.AppCompatActivity; nhập android.os.Bundle; nhập android.content.Context; nhập android.hardware.Sensor; nhập android.hardware.SensorEvent; nhập android.hardware.SensorManager; nhập android.hardware.SensorEventListener; nhập android.widget.TextView; lớp công khai MainActivity mở rộng AppCompatActivity // Thực hiện giao diện SensorEventListener // thực hiện SensorEventListener {// Tạo các biến của bạn // private SensSensens; riêng tư Trình quản lý cảm biến lân cậnSensorManager; TextView privateTextViewView; @Override void void onCreate (Gói đã lưuInstanceState) {super.onCreate (yetInstanceState); setContentView (R.layout.activity_main); lân cậnViewView ((TextView) findViewById (R.id.proighborTextView); // Lấy một phiên bản của SensorManager // lân cậnSensorManager = (Bộ điều khiển cảm biến) getSystemService (Context.SENSOR_SERVICE); // Kiểm tra cảm biến tiệm cận // lân cậnSensor = lân cậnSensorManager.getDefaultSensor (Cảm biến.TYPE_PROXIMITY); // Nếu cảm biến tiệm cận không tồn tại, thì sẽ hiển thị lỗi // Chuỗi sensor_error = getResource (). GetString (R.opes.no_sensor); if (lân cậnSensor == null) {lân cậnViewView.setText (sensor_error); }} @Override void void onStart () {super.onStart (); // Nếu cảm biến có sẵn trên thiết bị hiện tại ... // if (lân cậnSensor! = Null) {// Khăn.then đăng ký một trình lắng nghe // nearSensorManager.registerListener (this, nearSensor, // Chỉ định tần suất bạn muốn nhận dữ liệu mới // SensorManager.SENSOR_DELAY_NORMAL); }} @Override void void onStop () {super.onStop (); // Hủy đăng ký trình nghe của bạn để bảo toàn tài nguyên hệ thống // lân cậnSensorManager.unregisterListener (this); } @Override void công khai onSensorChanged (SensorEvent sensorEvent) {// Cảm biến Giá trị hiện tại cảm biến // float currentValue = sensorEvent.values; // Truy xuất chuỗi vùng lân cận vùng lân cận, chèn giá trị mới và cập nhật TextView // lân cậnViewView.setText (getResource (). GetString (R.opes.proighbor_sensor, currentValue)); } @Override // Nếu cảm biến Độ chính xác của Thay đổi Thay đổi .// Khoảng trống công khai trênAccuracyChanged (Cảm biến cảm biến, int i) {//...TO DO //}}

Kiểm tra: Làm thế nào gần người dùng với thiết bị của họ?

Để thử nghiệm ứng dụng này trên điện thoại thông minh hoặc máy tính bảng Android vật lý, hãy cài đặt ứng dụng trên thiết bị của bạn và sau đó thử nghiệm bằng cách di chuyển bàn tay của bạn về phía màn hình, sau đó di chuyển nó đi một lần nữa. Giá trị cảm biến tiệm cận có giá trị nên ghi lại chuyển động của bạn.

Chỉ cần lưu ý rằng các cảm biến tiệm cận có thể khác nhau giữa các thiết bị. Một số thiết bị chỉ có thể hiển thị hai giá trị lân cận - một để chỉ thị Gần Gần và một để chỉ thị Far Far - vì vậy, không có gì ngạc nhiên nếu bạn không thấy nhiều sự khác biệt trên thiết bị Android vật lý của mình.

Để kiểm tra ứng dụng này trên trình giả lập:

  • Cài đặt ứng dụng của bạn trên AVD.
  • Tìm nút Thêm nhiều điểm khác nhau và nhấp vào nút này, nó sẽ khởi chạy cửa sổ điều khiển Extended Extended.
  • Trong cửa sổ, menu bên trái, chọn các cảm biến ảo.
  • Chọn các thẻ cảm biến bổ sung khác.
  • Tìm thanh trượt của Pro Gần lân cận và kéo nó sang trái và phải để mô phỏng một đối tượng di chuyển đến gần thiết bị hơn, sau đó đi xa hơn. Các giá trị cảm biến tiệm cận của cảm biến nên thay đổi khi bạn thao tác với thanh trượt.

Bạn có thể tải về dự án đã hoàn thành từ GitHub.

Cảm biến chuyển động: Xử lý mảng đa chiều

Cho đến thời điểm này, chúng tôi đã tập trung vào các cảm biến cung cấp một mục dữ liệu duy nhất, nhưng có một số cảm biến cung cấp các mảng đa chiều cho mỗi SensorEvent. Các cảm biến đa chiều này bao gồm các cảm biến chuyển động, mà chúng tôi sẽ tập trung vào phần cuối cùng này.

Cảm biến chuyển động có thể giúp bạn:

  • Cung cấp một phương pháp thay thế đầu vào của người dùng. Ví dụ: nếu bạn đang phát triển một trò chơi di động thì người dùng có thể di chuyển nhân vật của họ xung quanh màn hình bằng cách nghiêng thiết bị của họ.
  • Suy ra hoạt động của người dùng. Nếu bạn đã tạo ra một ứng dụng theo dõi hoạt động, thì cảm biến chuyển động có thể giúp bạn đánh giá xem người dùng đang đi trong xe hơi, chạy bộ hay ngồi tại bàn của họ.
  • Xác định chính xác hơn định hướng.Nó có thể trích xuất tọa độ từ một thiết bị cảm biến chuyển động, và sau đó dịch chúng dựa trên hệ tọa độ Earth, để có cái nhìn sâu sắc chính xác nhất về định hướng hiện tại của thiết bị.

Trong phần cuối cùng này, chúng tôi sẽ sử dụng cảm biến vectơ xoay (TYPE_ROTATION_VECTOR). Không giống như các cảm biến ánh sáng và độ gần, đây là một cảm biến phần mềm đối chiếu dữ liệu từ thiết bị gia tốc kế, từ kế và cảm biến con quay hồi chuyển của thiết bị. Mặc dù làm việc với cảm biến này thường yêu cầu bạn thực hiện các chuyển đổi và biến đổi toán học, nó cũng có thể cung cấp cho bạn một loạt thông tin có độ chính xác cao về thiết bị.

Chúng tôi sẽ tạo ra một ứng dụng sử dụng cảm biến vectơ xoay để đo:

  • Sân cỏ. Đây là độ nghiêng từ trên xuống dưới của thiết bị.
  • Cuộn. Đây là độ nghiêng từ trái sang phải của thiết bị.

Hiển thị dữ liệu cuộn và cuộn thời gian thực

Vì chúng tôi đã đo hai số liệu, chúng tôi cần tạo hai TextView và hai tài nguyên chuỗi tương ứng:

Mở tệp String.xml và thêm vào như sau:

Bộ cảm biến chuyển động Cảm biến độ cao:% 1 $ .2f Cảm biến cuộn:% 1 $ .2f Không có cảm biến chuyển động có sẵn

Sử dụng cảm biến vectơ xoay trong ứng dụng của bạn

Chúng tôi sẽ sử dụng lại một số mã từ các ứng dụng trước đây của chúng tôi, vì vậy, hãy để tập trung vào các khu vực giao tiếp với cảm biến vectơ xoay, khác biệt đáng kể so với những gì chúng tôi đã thấy trước đây.

1. Sử dụng TYPE_ROTATION_VECTOR

Vì chúng tôi đang làm việc với cảm biến vectơ xoay, chúng tôi cần gọi phương thức getDefaultSensor () và sau đó truyền cho nó hằng số TYPE_ROTATION_VECTOR:

locationSensorManager.getDefaultSensor (Cảm biến.TYPE_ROTATION_VECTOR);

2. Dịch dữ liệu cảm biến

Không giống như các cảm biến ánh sáng và độ gần trước đó, cảm biến chuyển động trả về các mảng giá trị cảm biến đa chiều cho mỗi Cảm biến. Các giá trị này được định dạng bằng hệ thống tọa độ Tiêu chuẩn, X, Y, Z, tiêu chuẩn, được tính tương đối với thiết bị khi nó được giữ theo định hướng mặc định của nó.

Android không chuyển đổi các tọa độ X, Y và Z này để khớp với hướng hiện tại của thiết bị, do đó, trục X X sẽ vẫn giữ nguyên cho dù thiết bị ở chế độ dọc hay ngang. Khi sử dụng cảm biến vectơ xoay, bạn có thể cần phải chuyển đổi dữ liệu đến để khớp với xoay vòng hiện tại của thiết bị.

Chân dung là định hướng mặc định cho hầu hết các điện thoại thông minh, nhưng bạn không nên cho rằng đây sẽ là trường hợp cho tất cả các Thiết bị Android, đặc biệt là máy tính bảng. Trong bài viết này, chúng tôi sẽ sử dụng ma trận xoay để dịch dữ liệu cảm biến từ dữ liệu gốc của nó, thiết bị hệ tọa độ, để Trái đất hệ tọa độ, đại diện cho chuyển động và vị trí của thiết bị có liên quan đến Trái đất. Nếu được yêu cầu, chúng ta có thể sắp xếp lại dữ liệu cảm biến, dựa trên định hướng hiện tại của thiết bị.

Thứ nhất, hệ tọa độ thiết bị là hệ tọa độ 3 trục X, Y, Z tiêu chuẩn, trong đó mỗi điểm trên mỗi ba trục được biểu thị bằng một vectơ 3D. Điều này có nghĩa là chúng ta cần tạo một mảng gồm 9 giá trị float:

float rotationMatrix = new float;

Sau đó chúng ta có thể truyền mảng này cho phương thức getRotationMatrix ():

SensorManager.getRotationMatrixFromVector (rotationMatrix, vectơ); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

Bước tiếp theo, là sử dụng phương thức SensorManager.remapCoordinateSystem () để ánh xạ lại dữ liệu cảm biến, dựa trên định hướng hiện tại của thiết bị.

Phương thức SensorManager.remapCoordinateSystem () nhận các đối số sau:

  • Ma trận xoay ban đầu.
  • Các trục mà bạn muốn ánh xạ lại.
  • Mảng mà bạn đang cư trú với dữ liệu mới này.

Tại đây, mã mà tôi sẽ sử dụng trong ứng dụng của mình:

float điều chỉnhRotationMatrix = new float; SensorManager.remapCoordinateSystem (rotationMatrix, worldAxisX, worldAxisZ, điều chỉnhRotationMatrix);

Cuối cùng, chúng tôi sẽ gọi SensorManager.getOrientation và bảo nó sử dụng điều chỉnhRotationMatrix:

SensorManager.getOrientation (điều chỉnhRotationMatrix, định hướng);

3. Cập nhật chuỗi giữ chỗ

Vì chúng tôi có hai bộ dữ liệu (cao độ và cuộn), chúng tôi cần truy xuất hai chuỗi giữ chỗ riêng biệt, điền vào chúng các giá trị chính xác và sau đó cập nhật TextView tương ứng:

pitchTextView.setText (getResource (). getString (R.opes.pitch_sensor, pitch)); rollTextView.setText (getResource (). getString (R.opes.roll_sensor, roll));

Hiển thị nhiều dữ liệu cảm biến: Mã đã hoàn thành

Sau khi thực hiện các bước trên, MainActivity của bạn sẽ trông giống như thế này:

nhập android.app.Activity; nhập android.os.Bundle; nhập android.hardware.Sensor; nhập android.hardware.SensorEvent; nhập android.hardware.SensorEventListener; nhập android.hardware.SensorManager; nhập android.widget.TextView; lớp công khai MainActivity mở rộng Hoạt động thực hiện SensorEventListener {private SensorManager motionSensorManager; cảm biến chuyển động cảm biến riêng; TextView pitchTextView riêng; TextView rollTextView riêng; tư nhân tĩnh cuối cùng SENSOR_DELAY = 500 * 1000; private static int int FROM_RADS_TO_DEGS = -57; @Override void void onCreate (Gói đã lưuInstanceState) {super.onCreate (yetInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); thử {motionSensorManager = (Bộ điều khiển cảm biến) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Cảm biến.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (này, motionSensor, SENSOR_DELAY); } Catch (Exception e) {pitchTextView.setText (R.opes.no_sensor); rollTextView.setText (R.opes.no_sensor); }} @Override void công khai onAccuracyChanged (Cảm biến cảm biến, độ chính xác) }} Cập nhật void private (vectơ float) {// Tính toán ma trận xoay // float rotationMatrix = new float; SensorManager.getRotationMatrixFromVector (rotationMatrix, vectơ); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // Sắp xếp lại ma trận dựa trên định hướng hiện tại Activity Activity // float điều chỉnhRotationMatrix = new float; SensorManager.remapCoordinateSystem (rotationMatrix, worldAxisX, worldAxisZ, điều chỉnhRotationMatrix); // Tính toán định hướng thiết bị // float direction = new float; // Cung cấp mảng các giá trị float cho phương thức getOrientation () // SensorManager.getOrientation (điều chỉnhRotationMatrix, định hướng); phao nổi = định hướng * FROM_RADS_TO_DEGS; float roll = direction * FROM_RADS_TO_DEGS; // Cập nhật TextViews với các giá trị cao độ và cuộn // pitchTextView.setText (getResource (). GetString (R.opes.pitch_sensor, pitch)); rollTextView.setText (getResource (). getString (R.opes.roll_sensor, roll)); }}

Bạn có thể tải về dự án đã hoàn thành từ GitHub.

Kiểm tra ứng dụng cảm biến Android cuối cùng của chúng tôi

Để kiểm tra ứng dụng cảm biến Android xoay này trên điện thoại thông minh hoặc máy tính bảng Android vật lý:

  • Cài đặt ứng dụng trên thiết bị của bạn.
  • Đặt điện thoại thông minh hoặc máy tính bảng của bạn trên một bề mặt phẳng. Lưu ý rằng các cảm biến chuyển động cực kỳ nhạy cảm, do đó, nó không phải là bất thường đối với một thiết bị dường như bất động để báo cáo các dao động về giá trị cao độ và cuộn.
  • Để kiểm tra độ cao, hãy nhấc phần dưới của thiết bị lên để nó nghiêng ra khỏi bạn. Giá trị cao độ sẽ thay đổi đáng kể.
  • Để kiểm tra cuộn, hãy thử nâng phía bên trái của thiết bị của bạn, để nó nghiêng về bên trái - để mắt đến giá trị cuộn đó!

Nếu bạn đang thử nghiệm dự án của mình trên trình giả lập:

  • Cài đặt ứng dụng trên AVD của bạn.
  • Chọn Khác More, ra mắt cửa sổ điều khiển Extended Extended.
  • Trong menu bên trái, chọn các cảm biến ảo.
  • Hãy chắc chắn rằng tab Gia tốc kế được chọn. Tab này chứa các điều khiển có thể mô phỏng các thay đổi về vị trí và hướng của thiết bị.
  • Hãy thử trải nghiệm với các thanh trượt khác nhau (Xoay: Z-Rot, X-Rot, Y-Rot; và Di chuyển: X, Y và Z) và các nút Xoay Xoay Thiết bị khác nhau, để xem chúng ảnh hưởng đến cảm biến cuộn của ứng dụng của bạn như thế nào Giá trị và cảm biến sân thượng

Gói lại

Trong bài viết này, chúng tôi đã xem cách lấy dữ liệu từ ba loại cảm biến chính của Android: môi trường, vị trí và chuyển động và cách theo dõi dữ liệu này trong thời gian thực.

Bạn đã thấy bất kỳ ứng dụng Android nào sử dụng cảm biến theo những cách thú vị hoặc độc đáo chưa? Cho chúng tôi biết trong các ý kiến ​​dưới đây!

Counterpoint Reearch đã phát hành báo cáo lô hàng toàn cầu quý 2 năm 2019 và có vẻ như amung đã nổi lên như một trong những người chiến...

Google đã âm thầm cập nhật ứng dụng Dịch vụ ức khỏe thiết bị của mình, đưa khả năng thay đổi cài đặt Độ áng thích ứng của bạn trở lại mặc định của nhà ản xuất. Ch...

Chúng Tôi Khuyên