关于Android开发中SensorManager频率设置的问题

本文转载自:http://blog.csdn.net/faith306/article/details/9261137

今天无聊,看了看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);
}
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据