Không có cảm biến "định hướng" thực tế - đây là (thực tế) là một cảm biến tổng hợp, được tạo ra từ sự kết hợp của gia tốc kế và công tơ kế.
Từ http://developer.android.com/reference/android/hardware/SensorEvent.html
"loại cảm biến này tồn tại vì lý do di sản, xin vui lòng sử dụng getRotationMatrix() kết hợp với remapCoordinateSystem() và getOrientation() để tính toán các giá trị thay thế."
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) {
}
@Override
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]));
}
}
}
Có cách nào để sử dụng lệnh getOrientation() như trình xử lý sự kiện như cách các cảm biến khác được sử dụng? – user1207381
Hàm getOrientation() yêu cầu các giá trị từ getRotationMatrix() - đòi hỏi các giá trị từ cả cảm biến từ và cảm biến gia tốc. Vì vậy, bạn thiết lập trình xử lý cảm biến cho 2 cảm biến đó và lưu vào bộ nhớ cache các giá trị bạn nhận được cho chúng. Và sau đó bạn có thể tính toán lại hướng khi bạn nhận được dữ liệu mới cho một trong hai cảm biến. – JesusFreke
Mã mẫu của chúng có phù hợp với các phương pháp này không? Tôi đã không thể tìm thấy bất kỳ sử dụng các phương pháp này với nhau. – user1207381