2

私は新しいアプリケーションで課題に直面しています.天井または床に面したAndroidスマートフォンの画面を見つけたいです.Androidセンサーでこれを行うことができますか.誰かがこれを試した場合は、貴重なアイデアとチュートリアルを共有してください.

4

2 に答える 2

1

これを実現するためにを使用できますSensorEventListener。理解を深めるために、以下のコードをご覧ください。センサーの詳細については、開発者向けドキュメントでこれを確認することもできます。

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class SensorClass implements SensorEventListener {
    private float   mInR[];
    private float   mI[];
    private float   mGravity[];
    private float   mGeomag[];
    private float   mOrientVals[];

    final float rad2deg = 180/((float) Math.PI);

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here when accuracy changed
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        float azimuth = 0f;
        float pitch = 0f;
        float roll = 0f;

        // If the sensor data is unreliable return
        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
            return;

        // Gets the value of the sensor that has been changed
        switch (event.sensor.getType()){  
        case Sensor.TYPE_ACCELEROMETER:
            mGravity = event.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            mGeomag = event.values.clone();
            break;
        }

         if (mGravity != null && mGeomag != null){
            // checks that the rotation matrix is found
            if (SensorManager.getRotationMatrix(mInR, mI, mGravity, mGeomag)){

                // magnetic north and the horizon respectively
                SensorManager.getOrientation(mInR, mOrientVals);

                azimuth = mOrientVals[0]*rad2deg;
                pitch = mOrientVals[1]*rad2deg;
                roll = mOrientVals[2]*rad2deg;
            }
        }
    }
}
于 2013-03-14T10:43:46.593 に答える
1

oncreate

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    List<Sensor> sensorList = sensorManager
            .getSensorList(Sensor.TYPE_ACCELEROMETER);
    if (sensorList.size() > 0) {
        accelerometerPresent = true;
        accelerometerSensor = sensorList.get(0);
    }

を登録するSensorEventListener

        sensorManager.registerListener(accelerometerListener,
                accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);

そしてSensorEventListener実装

private SensorEventListener accelerometerListener = new SensorEventListener() {

    public void onAccuracyChanged(Sensor sensor, int accuracy) {            
    }

    public void onSensorChanged(SensorEvent event) {
        float z_value = event.values[2];
        if (z_value == 10) {
            // up facing
        } else if(z_value == -10)
            // down facing
        }           
    }
};

私の2つのデバイスでは、上向きで水平の場合はz_values = 10が表示され、反対の場合は-10が表示されます。ケースを確認してください。

于 2013-03-14T10:51:01.387 に答える