2

センサーについて調べてみると、sensorlistener(ここではコード内でmysensorlistener) を使用してすべてのセンサーをデバイスに登録すると、必要なものが得られることがわかりました。リスナーをsensoreventlistener(私のコードではmysensoreventlistener) に変更すると、加速度計のデータしか取得できなくなります。

1つ登録するだけで、すべてのデータを取得できたのだろうかsensorevevtlistener

コードは次のとおりです。

package com.example.testaccelerometer;


import com.example.testaccelerometer.R;

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

public class AccelerometerReader extends Activity {


    TextView atvx;
    TextView atvy;
    TextView atvz;
    TextView otvx;
    TextView otvy;
    TextView otvz;
    SensorManager mySensorManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.disp);
        atvx = (TextView)findViewById(R.id.atvx);
        atvy = (TextView)findViewById(R.id.atvy);
        atvz = (TextView)findViewById(R.id.atvz);
        otvx = (TextView)findViewById(R.id.otvx);
        otvy = (TextView)findViewById(R.id.otvy);
        otvz = (TextView)findViewById(R.id.otvz);
        mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        mySensorManager.unregisterListener(mySensorEventListener);
        //mySensorManager.unregisterListener(aSensorEventListener);
        //mySensorManager.unregisterListener(oSensorEventListener);
        super.onPause();
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        //mySensorManger.registerListener(mySensorListener, SensorManager.SENSOR_ALL,SensorManager.SENSOR_DELAY_FASTEST);
        mySensorManager.registerListener(mySensorEventListener, mySensorManager.getDefaultSensor(Sensor.TYPE_ALL), SensorManager.SENSOR_DELAY_GAME);
        //mySensorManager.registerListener(aSensorEventListener, mySensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
        //mySensorManager.registerListener(oSensorEventListener, mySensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME);
        super.onResume();
    }
    /*private SensorListener mySensorListener = new SensorListener(){

        public void onAccuracyChanged(int sensor, int accuracy) {
            // TODO Auto-generated method stub

        }

        public void onSensorChanged(int sensor, float[] values) {
            // TODO Auto-generated method stub
            switch(sensor){
            case SensorManager.SENSOR_ACCELEROMETER:
                atvx.setText("X轴方向的加速度:" + values[0]);
                atvy.setText("Y轴方向的加速度:" + values[1]);
                atvz.setText("Z轴方向的加速度:" + values[2]);
                break;
            case SensorManager.SENSOR_ORIENTATION:
                otvx.setText("X轴方向的角速度:" + values[0]);
                otvy.setText("Y轴方向的角速度:" + values[1]);
                otvz.setText("Z轴方向的角速度:" + values[2]);
            }
        }


    };*/
    private SensorEventListener mySensorEventListener = new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float[] values1;
            float[] values2;
            switch(event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                values1 = event.values;
                atvx.setText("X轴方向的加速度:" + values1[0]);
                atvy.setText("Y轴方向的加速度:" + values1[1]);
                atvz.setText("Z轴方向的加速度:" + values1[2]);
                System.out.println("run....accele");
                break;
            case Sensor.TYPE_ORIENTATION:
                values2 = event.values;
                otvx.setText("X轴方向的角速度:" + values2[0]);
                otvy.setText("Y轴方向的角速度:" + values2[1]);
                otvz.setText("Z轴方向的角速度:" + values2[2]);
                System.out.println("run....orien");
                break;
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };
    /*
     * test
     */
    /*private SensorEventListener aSensorEventListener = new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float[] values1;
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
                values1 = event.values;
                atvx.setText("X轴方向的加速度:" + values1[0]);          //accelerometer
                atvy.setText("Y轴方向的加速度:" + values1[1]);
                atvz.setText("Z轴方向的加速度:" + values1[2]);
                System.out.println("run....accele");
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };*/
        /*private SensorEventListener oSensorEventListener = new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float[] values1;
            if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
                values1 = event.values;
                otvx.setText("X轴方向的角速度:" + values1[0]);         //orientation
                otvy.setText("Y轴方向的角速度:" + values1[1]);
                otvz.setText("Z轴方向的角速度:" + values1[2]);
                System.out.println("run....orien");
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };*/
}

インターネットをサーフィンしていると、SensorEventListener は TYPE_ALL を使用してすべてのセンサーを登録することはできないが、それを使用してセンサーリストを取得できると言う人もいます。ここのコードのように:

//  注册加速度传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_FASTEST);

        //  注册磁场传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_FASTEST);

        //  注册光线传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_FASTEST);

        //  注册方向传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_FASTEST);
4

2 に答える 2

2

すべてのセンサーを同じリスナーに登録する必要がある場合は、次のようにします。

List<Sensor> sensors = mySensorManager.getSensorList( Sensor.TYPE_ACCELEROMETER  );
for(int i = 0; i < sensors.lenght(); i++) {
  mySensorManager.registerListener(mySensorListener, sensors[i], SensorManager.SENSOR_DELAY_FASTEST);
}

そして、情報を読むときは、次のようなスイッチを使用します。

this.mySensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    int type = sensor.getType();
    switch (type) {
    case Sensor.TYPE_ACCELEROMETER:
            doSomethingInteresting();
        break;
    case Sensor.TYPE_LINEAR_ACCELERATION:
                doSomethingInteresting();
        break;
    case ....:
                ......
                ......
            default:
        break;
         }
}
};

コードは完璧ではありません。コピーして貼り付けないでください。コンパイルできないと思います。

于 2012-10-22T17:47:35.957 に答える
0

さらに、アプリケーションが非表示になったときに登録を解除することを忘れないでください。そうしないと、バッテリーが消耗します。(sensorManager は、メソッド内で表示されるクラス変数である必要があります)

   @Override
protected void onStop() {        
    sensorManager.unregisterListener(mysel);
    super.onStop(); //now use super method
    finish();
}
于 2015-12-18T18:59:28.037 に答える