有没有办法检测Android设备的当前方向?
我不是在谈论屏幕方向,我在谈论设备的实际保持方式。到目前为止我找到的所有解决方案都告诉我屏幕方向(在我的应用程序中始终是纵向)。我需要知道用户是否正在水平握住设备,即使我没有旋转屏幕。
感谢。
答案 0 :(得分:3)
您可以使用加速度计。要使用它,您需要在传感器TYPE_ACCELEROMETER上注册一个监听器。
一旦完成,您将在此传感器的值发生变化时收到通知(当用户手持设备时非常频繁)。
从此传感器接收的值是(矢量表示)重力在X,Y和Z轴上的投影。 (嗯......这不完全正确:实际上这些值代表了应用于设备的所有力之和的投影)所以:
SensorEvent.values[0]
):表示设备的右边缘位于左边缘下方。SensorEvent.values[1]
):表示上边缘位于下边缘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");
}
}
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
你可以使用方向传感器在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]));
}
}
}