Androidハードウェアのセンサー

17592 ワード

Androidハードウェアのセンサー
センサーはAndroidの重要な一部であり、多くのデバイスがセンサーの一部をサポートしています.例えば、方向センサー(電子羅盤)、重力センサー(ワイルドカー、極品飛車、スクリーン反転など)
Android SDKは、現在のAndroidデバイスに内蔵されているセンサにアクセスできるAndroidセンサーフレームワークを提供しています.
すべての定数をSensorクラスで定義
1.   TYPE_ACCELEROMETER:加速センサー(ハードウェアセンサー)
2.   
TYPE_AMBIENT_TEMPERATURE:温度センサー
(ハードウェアセンサー)、Android 4.0(API Level=14)の後にこれを使い、その前にTYPE_TEMPERATURE
3.   
TYPE_GRAVITY:重力センサー
(ハードウェアまたはソフトウェアセンサ)
4.   
TYPE_GYROSCOPE:ジャイロセンサ
(ハードウェアセンサー)
5.   
TYPE_LIGHT:光線センサー
(ハードウェアセンサー)
6.   
TYPE_LINEAR_ACCELERATION:リニアアクセラレータ
(ハードウェアまたはソフトウェアセンサ)
7.   
TYPE_MAGNETIC_FIELD:磁界センサ
(ハードウェアセンサー)
8.  
 
TYPE_ORIENTATION:方向センサ
(ソフトウェアセンサ)、データは重力と磁場センサから
9.
   
TYPE_PRESSURE:圧力センサー
(ハードウェアセンサー)
10.
 
TYPE_PROXIMITY:近接センサー
(ハードウェアセンサー)
11.
 
TYPE_RELATIVE_HUMIDITY:湿度センサー
(ハードウェアセンサー)
12.
 
TYPE_ROTATION_VECTOR:回転ベクトルセンサ
(ハードウェアまたはソフトウェアセンサ)
一般的なクラス:
  • SensorManager:sensorサービスのインスタンスを作成します.このクラスは、センサにアクセスおよび列挙し、センサのリスニングを登録およびログアウトするための多くの方法を提供する.センサ精度、走査周波数、補正に関する定数も提供される.
  • Sensor:センサ技術パラメータを取得するためのいくつかのユーザの方法が提供される.例:バージョン、タイプ、メーカーなど.
  • SensorEvent:システムはこのクラスを使用してセンサオブジェクトを作成します.このオブジェクトは、センサイベントに関する情報を提供することができる.センサイベントオブジェクトに含まれる情報には、元のセンサ再送データ、センサタイプ、データの精度、およびイベントをトリガする時間がある.
  • SensorEventListener:このインタフェースは2つのコールバックメソッドを含み、センサのコールバック値が変化したり精度が変化したりすると、システムはこの2つのコールバックメソッドを呼び出します.

  • 例:本機のすべてのセンサを取得する
    public class MainActivity extends AppCompatActivity {
        private TextView tvSensors;
        private SensorManager sensorManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tvSensors = (TextView) findViewById(R.id.tvSensors);
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
            for (Sensor sensor : sensors)
            {
                tvSensors.append(sensor.getName() + "
    "); } } }

    どうさセンサ
    動作センサは、2つ(加速センサとジャイロセンサ)が純粋なハードウェアセンサである5つを含む.他の3つのセンサ(重力センサ、線形加速センサ、回転ベクトルセンサ)は、ハードウェアセンサであってもソフトウェアセンサであってもよい.
    動作センサは、傾斜、振動、回転、揺動など、検出装置の移動に非常に有用である.これらは通常、ユーザ入力に対する直接的な反応とも言える.(例えば、極品飛車で車を飛ばしたり、移動するボールをコントロールしたり)
    動作センサは3つの浮動小数点数の値(通常は長さ3の配列で返される)を返しますが、異なるセンサではこの3つの値の意味も使いません.たとえば、アクセラレータセンサでは、3つの座標軸のデータが返されます.ジャイロセンサでは、3つの座標軸の回転角度が返されます.
    例:重力センサと加速度センサの値を取得することにより,X,Y,Zの戻り値を動的にモニタする.
    public class MainActivity extends AppCompatActivity implements SensorEventListener{
        private TextView tvAccelerometer;
        private SensorManager mSensorManager;
        private float[] gravity = new float[3];
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);
            mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    
        }
        //            
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            switch (sensorEvent.sensor.getType())
            {
                case Sensor.TYPE_ACCELEROMETER:         //      
                    //            
                    final float g = (float) 0.98;
                    gravity[0] = g * gravity[0] + ( 1 - g ) * sensorEvent.values[0];
                    gravity[1] = g * gravity[1] + ( 1 - g ) * sensorEvent.values[1];
                    gravity[2] = g * gravity[2] + ( 1 - g ) * sensorEvent.values[2];
    
                    //         
                    String accelermoeter = "   :
    " + "X:" + (sensorEvent.values[0] - gravity[0])+ "
    " + "Y:" + (sensorEvent.values[1] - gravity[1])+ "
    " + "Z:" + (sensorEvent.values[2] - gravity[2])+ "
    " ; tvAccelerometer.setText(accelermoeter); // x,y,z , break; case Sensor.TYPE_GRAVITY: gravity[0] = sensorEvent.values[0]; gravity[1] = sensorEvent.values[1]; gravity[2] = sensorEvent.values[2]; break; } } // @Override public void onAccuracyChanged(Sensor sensor, int i) { } // , @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_FASTEST); } // Activity , @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } }

    位置センサ
    Androidは2つのセンサを提供して装置の位置を決定し、この2つのセンサは磁場センサと方向センサである.
    もう1つの比較的特殊な測定装置の正面からある隣接物体までの距離を測定するセンサ(隣接センサ).
    磁場センサと近接センサはハードウェアベースのセンサである.ほとんどのAndroid携帯電話やタブレットには磁場センサがあります.
    近接センサーは携帯電話でよく見られます.例えば、大きな顔で電話に出るとき、携帯電話の画面からどのくらい離れているか、耳に近いうちに電話に出るときにいくつかの仕事を完成することができます.
    方向センサは、加速度センサおよび磁場センサからのフィードバックデータをベースとするソフトウェアである.
    位置センサは,装置の真の世界における物理的位置を決定するのに非常に有用である.例えば、磁界センサと加速度センサ測定装置の地磁気北極に対する位置を組み合わせてもよく、方向センサを用いて現在の装置の自己参照系に対する位置を決定してもよい.
    磁場センサと方向センサは共に3つの値(SensorEvent.values)を返し,近接センサは1つの値のみを返した.
    方向センサーの3つの値:
  • SensorEvent.values[0]:Z軸回りに回転する角度.Y軸が北に向いている場合、値は0で、東を指し、値は90で、南を指し、値は180で、西を指し、値は270です.
  • SensorEvent.values[1]:X軸回りに回転する度数.Z軸の正方向からY軸の正方向に向かうと、この値は正の値となります.逆に、負の値です.この値は-180~180の間で変動する.
  • SensorEvent.values[2]:Y軸回りに回転する度数.Z軸の正方向からX軸の正方向に向かうと、この値は正の値となります.逆に、負の値です.この値は-180~180の間で変動する.

  • 近接センサーの値:
    SensorEvent.values[0]:携帯電話の正面距離物理に近い距離(cm)
    使用方法は上記とあまり差がありません.
    mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
            SensorManager.SENSOR_DELAY_UI);

    かんきょうセンサ
    Androidは、異なる外部環境を監視するための4つのセンサを提供しています.これらのセンサを用いて周囲を監視することができる.例えば、周囲の空気の湿度、光線、空気の圧力、および温度を監視することができる.この4つのセンサはいずれもハードウェアベースのセンサである.光線センサ以外の3つのセンサは通常の装置では珍しい.
    すべての環境センサには1つの戻り値しかありません.例えば、温度センサは摂氏度を返し、圧力センサは圧力の強さ値を返します.
    環境センサは他の要因の干渉を受けることは少ない.
    光線のおおよその値:
    public static final float LIGHT =
     
    120000.0f;    
    //最強の光の強さ(砂漠地帯とか)
    110000.0f;
        
    //雲ひとつない時の直射日光の強さ
    20000.0f;
       
    //日差しはあるが、雲に一部の光を消されたときの強さ
    10000.0f;
       
    //曇り時の光線強度
    400.0f;  
       
    //太陽が昇ったばかりの日の光の強さ
    100.0f;
       
       
    //雨の日、太陽がない時の強さ
    0.25f;
       
       
    //夜の月の光の強さ
    0.001f;
       
       
    //夜に月がない時(真っ暗で街灯がない)の光の強さ