android Sensor一些手機感應效果

jopen 10年前發布 | 34K 次閱讀 Android Android開發 移動開發

1.Sensor Type
      重力感應/加速度傳感器 (G-Sensor)
       光感應   (Light-Sensor) 
      溫度感應
      方向感應
      磁場、
      臨近性


2.如何實現Sensor編程
     a.獲取系統服務(SENSOR_SERVICE)返回一個SensorManager 對象
           sensormanager = (SensorManager)getSystemSeriver(SENSOR_SERVICE);
     b.通過SensorManager對象獲取相應的Sensor類型的對象
           sensorObject = sensormanager.getDefaultSensor(sensor Type);
     c.聲明一個SensorEventListener 對象用于偵聽Sensor 事件,并重載onSensorChanged方法
            SensorEventListener sensorListener = new SensorEventListener(){
             };
     d.注冊相應的SensorService
             sensormanager.registerListener(sensorListener, sensorObject, Sensor TYPE);
    e.銷毀相應的SensorService
            sensormanager.unregisterListener(sensorListener, sensorObject);
 
    f: SensorListener 接口是傳感器應用程序的中心。它包括兩個必需方法:
          onSensorChanged(int sensor,float values[]) 方法在傳感器值更改時調用。
          該方法只對受此應用程序監視的傳感器調用(更多內容見下文)。該方法的參數包括:一個整數,指示更改的傳感器;一個浮點值數組,表示傳感器數據本身。有些傳感器只提供一個數據值,另一些則提供三個浮點值。方向和加速表傳感器都提供三個數據值。
      當傳感器的準確性更改時,將調用 onAccuracyChanged(int sensor,int accuracy) 方法。參數包括兩個整數:一個表示傳感器,另一個表示該傳感器新的準確值。

 
3.關于G-Sensor
  Android 加速度傳感器的類型是 Sensor.TYPE_ACCELEROMETER
  通過 android.hardware.SensorEvent 返回加速度傳感器值。
  加速度傳感器返回值的單位是加速度的單位 m/s^2(米每二次方秒),有三個方向的值分別是
  values[0]: x-axis 方向加速度
  values[1]: y-axis 方向加速度
  values[2]: z-axis 方向加速度
  其中x,y,z方向的定義是以水平放置在的手機的右下腳為參照系坐標原點

  x 方向就是手機的水平方向,右為正
  y 方向就是手機的水平垂直方向,前為正
  y 方向就是手機的空間垂直方向,天空的方向為正,地球的方向為負
需要注意的是,由于地球固有的重力加速度g (值為9.8 m/s^2),
  因此現實中實際加速度值應該是 z方向返回值 - 9.8 m/s^2.
  比如你以 2 m/s^2 的加速度將手機拋起,這時z方向的返回值應該是 11.8 m/s^2.
  反之若以手機以2 m/s^2 的加速度墜落,則z方向的返回值應該是 7.8 m/s^2.
  x,y方向則沒有上述限制。


我自己寫了一個類似于微信的搖一搖的效果,代碼如下,

import android.app.Activity;
import android.app.Service;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Sensor extends Activity implements SensorEventListener{
    private TextView tv =null;
    private Button button = null;
    private SensorManager sensorManager =null;
    private Vibrator vibrator = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sensor);
        tv = (TextView) findViewById(R.id.textview1);
        button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                tv.setText("文本復原");
            }
        });
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
    }
    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(android.hardware.Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        int sensorType = event.sensor.getType(); 
        //values[0]:X軸,values[1]:Y軸,values[2]:Z軸 
        float[] values = event.values; 
        if(sensorType == android.hardware.Sensor.TYPE_ACCELEROMETER){             
            if((Math.abs(values[0])>17||Math.abs(values[1])>17||Math.abs(values[2])>17)){ 
                Log.d("sensor ", "============ values[0] = " + values[0]); 
                Log.d("sensor ", "============ values[1] = " + values[1]); 
                Log.d("sensor ", "============ values[2] = " + values[2]); 
                tv.setText("搖一搖"+"\n"+values[0]+"\n"+values[1]+"\n"+values[2]); 
                //搖動手機后,再伴隨震動提示~~ 
                vibrator.vibrate(500); 
            } 
        }
    }
    @Override
    public void onAccuracyChanged(android.hardware.Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

}

<uses-permission android:name="android.permission.VIBRATE" />記住權限一定要給。

來自:http://my.oschina.net/u/1270405/blog/341771

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!