Android開発 - 加速度センサー

2011/07/10 23:52Update
TAGS: Android | 開発 | 加速度センサー | Sensor | SensorManager | TYPE_ACCELEROMETER

Androidのセンサーの基本的な利用方法と加速度センサーの利用方法例です。

はじめに


Android開発入門 Hello world
Android開発 ドラッグ&ドロップでアプリにウィジェット追加
Android開発 - 副画面を作成


センサーの利用方法(手順)について


■センサー関連のクラス
android.hardware.Sensor;
android.hardware.SensorEvent;
android.hardware.SensorEventListener;
android.hardware.SensorManager;

■センサー利用の手順として
1)SensorManagerインスタンスを取得
SensorManager sensorManager =  (SensorManager) getSystemService(SENSOR_SERVICE);


2)センサーを取得
例えば、加速度センサーの取得の場合
//加速度センサーリスト
List<Sensor> accelerometerSensorList = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);


3)センサーのイベント・リスナー登録
Sensor accelerometerSensor = accelerometerSensorList.get(0);
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_FASTEST);


4)SensorEventListener.onSensorChanged(SensorEvent event)を実装


Androidが提供しているセンサーの種類について

Sensor.TYPE_ALL    全部のセンサー
Sensor.TYPE_ACCELEROMETER    加速度センサー
Sensor.TYPE_GYROSCOPE    ジャイロスコープセンサー
Sensor.TYPE_LIGHT    照度(環境光)センサー
Sensor.TYPE_MAGNETIC_FIELD    地磁気センサー
Sensor.TYPE_ORIENTATION    方位(非推奨)センサー
Sensor.TYPE_PRESSURE    加圧センサー
Sensor.TYPE_PROXIMITY    接近センサー
Sensor.TYPE_TEMPERATURE    温度センサー



以下は加速度センサーの利用方法例です。

レイアウト




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" android:orientation="vertical">
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1">
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="センサー名:" android:id="@+id/textView1"></TextView>
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/sensorName"></TextView>
    </LinearLayout>
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="センサー値を取得:" android:id="@+id/textView3"></TextView>
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/sensorValue"></TextView>
    
</LinearLayout>


Activityクラス


AccelerometerSensorActivity.java
package com.syboos.android;

import java.util.List;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

//加速度センサーの利用方法
public class AccelerometerSensorActivity extends Activity implements
        SensorEventListener {
    //センサー・マネージャ
    private SensorManager sensorManager;
    
    //センサー表示関連のTextView
    private TextView sensorName;    //センサー名
    private TextView sensorValue;    //センサー値
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sensor);
        
        //センサー表示
        sensorName = (TextView)findViewById(R.id.sensorName);
        sensorValue = (TextView)findViewById(R.id.sensorValue);
                
        ////////////////////////////////////////
        //SensorManagerインスタンスを取得
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        
        //加速度センサー リストを取得
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
        //sensorManager.getSensorList(Sensor.TYPE_ALL);        すべてのセンサーを取得
        
        if (sensorList != null && !sensorList.isEmpty()) {
            //1個目のセンサーを取得
            Sensor sensor = sensorList.get(0);
            //取得したセンサーに リスナーを設定
            sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
            
            sensorName.setText("加速度センサー:" + sensor.getName());
        }
    }
    /* 
     * センサーの精度が変更された時に呼び出される
     */
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        //今回は利用しない
    }

    @Override
    protected void onResume() {
        super.onResume();
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        
        sensorManager.unregisterListener(this);
    }
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            //加速度センサーの場合
            
            float x = event.values[SensorManager.DATA_X];    //X軸
            float y = event.values[SensorManager.DATA_Y];    //Y軸
            float z = event.values[SensorManager.DATA_Z];    //Z軸
            
            this.sensorValue.setText(
                    "[X軸=" + x + "] " +    
                    "[Y軸=" + y + "] " +
                    "[Z軸=" + z + "] ");
        }
    }

}



結果確認


こんな感じです。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation