簡體   English   中英

檢測Android設備方向(不是屏幕方向)

[英]Detect Android device orientation (NOT screen orientation)

有沒有辦法檢測Android設備的當前方向?

我不是在談論屏幕方向,我在談論設備的實際保持方式。 到目前為止我找到的所有解決方案都告訴我屏幕方向(在我的應用程序中始終是縱向)。 我需要知道用戶是否正在水平握住設備,即使我沒有旋轉屏幕。

謝謝。

您可以使用加速度計。 要使用它,您需要在傳感器TYPE_ACCELEROMETER上注冊一個監聽器。

一旦完成,您將在此傳感器的值發生變化時收到通知(當用戶手持設備時非常頻繁)。

從該傳感器接收的值是(矢量表示)重力在X,Y和Z軸上的投影。 (嗯......這不完全正確:實際上這些值代表了應用於設備的所有力之和的投影)所以:

  • X軸上的正值( SensorEvent.values[0] ):表示設備的右邊緣位於左邊緣下方。
  • Y軸上的正值( SensorEvent.values[1] ):表示上邊緣位於下邊緣下方
  • Z軸上的正值( SensorEvent.values[2] ):表示設備的正面朝向地面,因此必須反轉前2個規則。

這是示例代碼(警告:它不關心Z軸上的值)

/**
 *  Logs the device orientation. Results are not valid when the screen is facing the ground.
 *  (when the discriminant value is low (i.e. device almost horizontal) : no logs)
 */
public void onSensorChanged(SensorEvent event) {
    if (event.sensor == mAccelerometer) {
        if(Math.abs(event.values[1]) > Math.abs(event.values[0])) {
            //Mainly portrait
            if (event.values[1] > 1) {
                Log.d(TAG,"Portrait");
            } else if (event.values[1] < -1) {
                Log.d(TAG,"Inverse portrait");
            }
        }else{
            //Mainly landscape
            if (event.values[0] > 1) {
                Log.d(TAG,"Landscape - right side up");
            } else if (event.values[0] < -1) {
                Log.d(TAG,"Landscape - left side up");
            }
        }
    }
}

您可以使用方向傳感器在2.2之前進行 - 這只是加速度計和磁力計的混合搭配,然后棄用2.2。 現在您可以自己編寫課程代碼。 來自https://stackoverflow.com/a/10291428/1081340

public class OrientationTestActivity extends Activity implements SensorEventListener
{
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    private Sensor mMagnetometer;

    private float[] mLastAccelerometer = new float[3];
    private float[] mLastMagnetometer = new float[3];
    private boolean mLastAccelerometerSet = false;
    private boolean mLastMagnetometerSet = false;

    private float[] mR = new float[9];
    private float[] mOrientation = new float[3];

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    }

    protected void onResume() {
        super.onResume();
        mLastAccelerometerSet = false;
        mLastMagnetometerSet = false;
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

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

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor == mAccelerometer) {
            System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
            mLastAccelerometerSet = true;
        } else if (event.sensor == mMagnetometer) {
            System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
            mLastMagnetometerSet = true;
        }
        if (mLastAccelerometerSet && mLastMagnetometerSet) {
            SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
            SensorManager.getOrientation(mR, mOrientation);
            Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f",
                                                           mOrientation[0], mOrientation[1], mOrientation[2]));
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM