設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 598|回復: 0
打印 上一主題 下一主題

Android_接收Sensor數據(以方向感應器為例[Sensor.TYPE_ORIENTATION])

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2016-9-27 14:58:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Android_接收Sensor數據(以方向感應器為例[Sensor.TYPE_ORIENTATION])
手機上有很多感應器,其中最容易被拿出來製作相關應用程式的就是方向感應器,其應用百百種但最重要的就是取得感應器所偵測到的數值,才可能進行更進階的開發。

程式碼:
1. AndroidManifest.xml
只在activity內增加android:screenOrientation="portrait",為了讓測試程式時,不會因為螢幕轉向而造成困擾。

2. main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical"
  4.    android:layout_width="fill_parent"
  5.    android:layout_height="fill_parent"
  6.    >
  7. <TextView
  8.    android:layout_width="fill_parent"
  9.    android:layout_height="wrap_content"
  10.    android:text="@string/hello"
  11.    />
  12.   
  13.    <TextView
  14.   android:id="@+id/lab_X"
  15.   android:layout_width="wrap_content"
  16.   android:layout_height="wrap_content"
  17.   android:text=""
  18.   android:layout_x="20px"
  19.   android:layout_y="45px"
  20. ></TextView>
  21.   
  22.    <TextView
  23.   android:id="@+id/lab_Y"
  24.   android:layout_width="wrap_content"
  25.   android:layout_height="wrap_content"
  26.   android:text=""
  27.   android:layout_x="20px"
  28.   android:layout_y="45px"
  29. ></TextView>
  30.   
  31.    <TextView
  32.   android:id="@+id/lab_Z"
  33.   android:layout_width="wrap_content"
  34.   android:layout_height="wrap_content"
  35.   android:text=""
  36.   android:layout_x="20px"
  37.   android:layout_y="45px"
  38. ></TextView>
  39.   
  40. </LinearLayout>
複製代碼
僅加上三個TextView來顯示感應器三方向的數值

3. java code
A. 要使用感應器,就必須要在Activity上implements SensorEventListener,並且利用Eclipse實作出onAccuracyChanged與onSensorChanged。
  1. public class OlaTeach_SensorOnly extends Activity  implements SensorEventListener{
  2.        @Override
  3. public void onSensorChanged(SensorEvent event) {
  4.   // TODO Auto-generated method stub
  5. }
  6. @Override
  7. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  8.   // TODO Auto-generated method stub
  9. }
  10. }
複製代碼
B.讓Activity具備SensorEventListener的功能後,必須要建立一個感應器的管理者(SensorManager),而該管理者就是用來指定接收的感應器有哪些,所以我們在onCreate的時候取得手機的感應器[getSystemService(SENSOR_SERVICE)],然後在onResume的時候去註冊要監聽的感應器,而在onPause的時候去解除監聽,概念就像下圖:

C. 以上程式碼都完成以後,當Activity處於onResume狀態時,程式就會在監聽的感應器數值改變時觸發onSensorChanged的事件,所以我們可以將要顯示數值的程式碼寫在這邊

  1. @Override
  2. public void onSensorChanged(SensorEvent event) {
  3.    float[] values = event.values;
  4.    lab_X.setText("X:" + String.valueOf(values[0]));
  5.    lab_Y.setText("Y:" + String.valueOf(values[1]));
  6.    lab_Z.setText("Z:" + String.valueOf(values[2]));
  7. }
複製代碼
以方向感應器來說:
第一個值(values[0])代表手機的水平旋轉
第二個值(values[1])代表手機的前後翻轉
第三個值(values[2])代表手機的左右翻轉

全部程式碼:
  1. package ola.OlaTeach_SensorOnly;

  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.hardware.Sensor;
  5. import android.hardware.SensorEvent;
  6. import android.hardware.SensorEventListener;
  7. import android.hardware.SensorManager;
  8. import android.os.Bundle;
  9. import android.view.WindowManager;
  10. import android.widget.TextView;

  11. public class OlaTeach_SensorOnly extends Activity  implements SensorEventListener{
  12.     /** Called when the activity is first created. */
  13.    
  14. private TextView lab_X;
  15. private TextView lab_Y;
  16. private TextView lab_Z;

  17. private SensorManager sensorManager;

  18. @Override
  19.     public void onCreate(Bundle savedInstanceState) {
  20.         super.onCreate(savedInstanceState);
  21.         setContentView(R.layout.main);
  22.         FindViews();
  23.         sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
  24.     }

  25. @Override
  26. protected void onResume() {
  27.   super.onResume();
  28.   SetSensor();
  29.   getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  30. }

  31.     @Override
  32. protected void onPause() {
  33.   super.onPause();
  34.   //解除感應器註冊
  35.   sensorManager.unregisterListener(this);
  36. }
  37.    
  38.     private void FindViews()
  39.     {
  40.      lab_X = (TextView) this.findViewById(R.id.lab_X);
  41.      lab_Y = (TextView) this.findViewById(R.id.lab_Y);
  42.      lab_Z = (TextView) this.findViewById(R.id.lab_Z);
  43.     }
  44.    
  45.     protected void SetSensor()
  46.     {
  47.      List sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
  48.      //如果有取到該手機的方位感測器,就註冊他。
  49.      if (sensors.size()>0)
  50.      {
  51.       //registerListener必須要implements SensorEventListener,
  52.       //而SensorEventListener必須實作onAccuracyChanged與onSensorChanged
  53.       //感應器註冊
  54.       sensorManager.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
  55.      }
  56.     }
  57.    
  58.     @Override
  59. public void onSensorChanged(SensorEvent event) {
  60.   // TODO Auto-generated method stub
  61.   float[] values = event.values;
  62.   lab_X.setText("X:" + String.valueOf(values[0]));
  63.   lab_Y.setText("Y:" + String.valueOf(values[1]));
  64.   lab_Z.setText("Z:" + String.valueOf(values[2]));
  65. }

  66. @Override
  67. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  68.   // TODO Auto-generated method stub
  69. }
  70. }
複製代碼
理論上,大概5分鐘後,就會看到自己拿著手機轉來轉去看數值的變化。





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-5-29 10:39 , Processed in 0.222046 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表