關於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);
    }
}


發佈了8 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章