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


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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值