sensor or listener is null
1.加入圖片
2./res/layout/main.xml
3.Main.java
package tw.android;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
public class Main extends Activity implements SensorEventListener {
private ImageView image;
// 初始角度
private float currentDegree = 0f;
// 感應器管理
private SensorManager mSensorManager;
private TextView tvHeading;
float[] mGravity;
float[] mGeomagnetic;
float Rotation[] = new float[9];
float[] degree = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
image = (ImageView) findViewById(R.id.imageViewCompass);
tvHeading = (TextView) findViewById(R.id.tvHeading);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
// 註冊感應監聽器
Sensor accelerometer = mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magnetometer = mSensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mSensorManager.registerListener(this, accelerometer,
SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this, magnetometer,
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onPause() {
super.onPause();
// 停止感應監聽器
mSensorManager.unregisterListener(this);
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
mGravity = event.values;
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
mGeomagnetic = event.values;
}
if (mGravity != null && mGeomagnetic != null) {
SensorManager.getRotationMatrix(Rotation, null, mGravity,
mGeomagnetic);
SensorManager.getOrientation(Rotation, degree);
degree[0] = (float) Math.toDegrees(degree[0]);
tvHeading.setText("Heading: " + (int) degree[0] + " degrees");
// currentDegree-初始角度,-degree逆時針旋轉結束角度
RotateAnimation ra = new RotateAnimation(currentDegree, -degree[0],
Animation.RELATIVE_TO_SELF, 0.5f, // x座標
Animation.RELATIVE_TO_SELF, 0.5f); // y座標
// 轉動時間
ra.setDuration(210);
// 預設狀態結束後的動作設定
ra.setFillAfter(true);
// 將動作放入圖片
image.startAnimation(ra);
currentDegree = -degree[0];
}
}
/* 改變經確度 */
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// not in use
}
}
檔案下載:
https://github.com/terryyamg/compassTest
參考來源:
http://www.javacodegeeks.com/2013/09/android-compass-code-example.html
http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html


話說TYPE_ORIENTATION 已經棄用了喔
回覆刪除話說TYPE_ORIENTATION 已經棄用了喔
回覆刪除感謝提供訊息~~檔案已更新。
刪除感謝分享!
回覆刪除