歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android傳感器的運用之ACCELEROMETER

Android傳感器的運用之ACCELEROMETER

日期:2017/3/1 10:35:00   编辑:Linux編程
Android中支持很多種傳感器:
比如加速度,重力的,光感,磁感等等。
在運用該API常用到的兩個類和一個接口
SensorManager:傳感器管理類;
Sensor:一個描述傳感器的類;
SensorEventListener:傳感器事件監聽類(SensorListener類已過期);
一般運用步驟:

1.通過上下文獲取SensorManager的對象。

[java]
  1. Context.getSystemService(Context.Sensor_service);
2.實例化一個你需要使用的sensor對象。

[java]
  1. Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
也可以通過getSensorList()來獲取所有的傳感器對象,返回一個list;
3.實現傳感器監聽接口
4.注冊傳感器
5.反注冊傳感器
代碼例子都很簡單簡短。
以下附上我以前用到的一個關於加速度的傳感器,我用來做搖晃事件監聽;

[java]
  1. /**
  2. * 搖動檢測器
  3. * @author Nono
  4. *
  5. */
  6. public class ShakeDetector implements SensorEventListener{
  7. private static final String TAG = ShakeDetector.class.getSimpleName();
  8. private static final double SHAKE_SHRESHOLD = 7000d;
  9. private Context mContext;
  10. private long lastTime ;
  11. private float last_x;
  12. private float last_y;
  13. private float last_z;
  14. private SensorManager sensorManager;
  15. private onShakeListener shakeListener;
  16. /**
  17. * 構造
  18. * @param context
  19. */
  20. public ShakeDetector(Context context){
  21. mContext = context;
  22. sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
  23. }
  24. /**
  25. * 注冊傳感器
  26. */
  27. public boolean registerListener() {
  28. if (sensorManager != null) {
  29. Sensor sensor = sensorManager
  30. .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  31. if (sensor != null) {
  32. this.sensorManager.registerListener(this, sensor,
  33. SensorManager.SENSOR_DELAY_GAME);
  34. LogUtil.log(TAG, "registerListener: succeed!!");
  35. return true;
  36. }
  37. }
  38. return false;
  39. }
  40. /**
  41. * 反注冊傳感器
  42. */
  43. public void unRegisterListener() {
  44. if (sensorManager != null)
  45. sensorManager.unregisterListener(this);
  46. }
  47. public void setOnShakeListener(onShakeListener listener){
  48. shakeListener = listener;
  49. }
  50. public void onSensorChanged(SensorEvent event) {
  51. //if (event.sensor.getType() == SensorManager.SENSOR_ACCELEROMETER) {
  52. long curTime = java.lang.System.currentTimeMillis();
  53. if ((curTime - lastTime) > 10) {
  54. long diffTime = (curTime - lastTime);
  55. lastTime = curTime;
  56. float x = event.values[0];
  57. float y = event.values[1];
  58. float z = event.values[2];
  59. float speed = Math.abs(x + y + z - last_x - last_y - last_z)
  60. / diffTime * 10000;
  61. if (speed > SHAKE_SHRESHOLD) {
  62. // 檢測到搖晃後執行的代碼
  63. shakeListener.onShake();
  64. }
  65. last_x = x;
  66. last_y = y;
  67. last_z = z;
  68. }
  69. //}
  70. }
  71. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  72. // TODO Auto-generated method stub
  73. }
  74. /**
  75. *
  76. * @author Nono
  77. *
  78. */
  79. public interface onShakeListener{
  80. public void onShake();
  81. }
  82. }
上面是自己實現的一個關於加速度的傳感器類
在Activity中實例化該類,並實現onShakeListener接口

[java]
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
  4. super.onCreate(savedInstanceState);
  5. mContext = this;
  6. mShakeDetector = new ShakeDetector(mContext);
  7. mShakeDetector.setOnShakeListener(this);
然後你可以在Activity的幾個生命周期中實現它的注冊和反注冊。
在onshakeListener中onShake方法中做傳感器檢測到變動的事件處理。
Copyright © Linux教程網 All Rights Reserved