今天無聊,看了看Android手機傳感器部分的編程,看到Android手機中的傳感器在註冊監聽的時候,需要設置一個頻率,其實這個頻率可以理解爲獲取傳感器狀態和值的頻率,我之前以爲在Android手機中這個頻率是固定的,或者說對於某一廠商的產品是固定的,但是經過我的測試,發現並非如此,現在基本可以斷定,這個取值的頻率和硬件有關,也就是說不同的底層硬件就有不同的頻率。
在Android編程中 SensorManager的頻率總共分爲4等,分別是:
SENSOR_DELAY_FASTEST最靈敏,快的然你無語
SENSOR_DELAY_GAME遊戲的時候用這個,不過一般用這個就夠了
SENSOR_DELAY_NORMAL比較慢。
SENSOR_DELAY_UI最慢的
經過我的測試,一般程序使用SENSOR_DELAY_GAME是最合適的,如果使用SENSOR_DELAY_UI可能會造成你獲取的數據出現滯後的情況,建議不要使用。
我的手機是中興U985,我使用SENSOR_DELAY_GAME頻率,測試的結果是每秒鐘取值20~25次,我用同學的手機中興U970,測試結果是每秒鐘29次左右,所以以後如果大家再想知道自己手機準確的硬件頻率,可以自行動手測試,這裏貼出我的代碼
佈局文件代碼:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:hint="test"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />
</RelativeLayout>
Activity代碼:
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.EditText;
public class MainActivity extends Activity {
private SensorManager sensorManager;
private EditText txt1;
private sensorlistener sl;
public static Handler handler;
public static long start_time;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start_time = System.currentTimeMillis();
txt1 = (EditText)findViewById(R.id.txt1);
//獲取系統的傳感器管理服務
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
sl = new sensorlistener();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Bundle b = msg.getData();
txt1.setText(b.get("result").toString());
super.handleMessage(msg);
}
};
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//爲系統的方向傳感器註冊監聽事件
sensorManager.registerListener(sl, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
sensorManager.unregisterListener(sl);
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
}
SensorEventListener代碼:
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.os.Bundle;
import android.os.Message;
public class sensorlistener implements SensorEventListener {
//記錄取值次數
private static long count = 0;
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
count++;
float[] values = event.values;
StringBuilder sb = new StringBuilder();
sb.append("手機與正北方向的角度(原始):\n");
sb.append(values[0]);
sb.append("\n手機與正北方向的角度(取整):\n");
sb.append((int)values[0]);
sb.append("\n手機頂部和尾部的角度:\n");
sb.append(values[1]);
sb.append("\n手機左側和右側的角度:\n");
sb.append(values[2]);
sb.append("\n傳感器取值頻率爲:\n");
sb.append(1000 / ((System.currentTimeMillis() - MainActivity.start_time) / count));
Bundle b = new Bundle();
b.putString("result", sb.toString());
Message msg = new Message();
msg.setData(b);
MainActivity.handler.sendMessage(msg);
}
}