zoukankan      html  css  js  c++  java
  • 检测手机传感器【Sensor】

          今天做了一个小Demo,主要是检测手机传个器种类个数,代码如下。

    View Code
    <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"
        tools:context=".MainActivity" >
        <TextView
            android:id="@+id/tv_view"
            android:textStyle="italic"
            android:textSize="18sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:layout_centerHorizontal="true"
            android:text="@string/hello_world" />
    </RelativeLayout>
    View Code
    package com.example.sensordemo;
    
    import java.util.List;
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.text.method.ScrollingMovementMethod;
    import android.view.Menu;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        private TextView tv_view;
        private Sensor sensor;
        private float x, y, z;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            init();
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    
        private void init() {
            tv_view = (TextView) this.findViewById(R.id.tv_view);
            /** 设置实例化滚动方法 */
            tv_view.setMovementMethod(ScrollingMovementMethod.getInstance());
            
            // 从系统服务中获得传感器管理器
            SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            // 从传感器管理器中获得全部的传感器列表
            List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
            // 显示有多少个传感器
            tv_view.setText("经检测手机有" + "【" + allSensors.size() + "】" + "个传感器。"
                    + "\n" + "他们分别是:\n");
    
            // 显示每个传感器的具体信息
            for (Sensor s : allSensors) {
                String temp = "\n" + "设备名称:" + s.getName() + "\n" + "设备版本:"
                        + s.getVersion() + "\n" + "设备供应商:" + s.getVendor() + "\n";
                switch (s.getType()) {
                case Sensor.TYPE_ACCELEROMETER:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + "加速度传感器:" + temp);
                    break;
                case Sensor.TYPE_GRAVITY:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 重力传感器:" + temp);
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 陀螺仪传感器:" + temp);
                    break;
                case Sensor.TYPE_LIGHT:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 环境光线传感器:" + temp);
                    break;
                case Sensor.TYPE_LINEAR_ACCELERATION:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 线性加速器:" + temp);
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 电磁场传感器:" + temp);
                    break;
                case Sensor.TYPE_ORIENTATION:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 方向传感器:" + temp);
                    break;
                case Sensor.TYPE_PRESSURE:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 压力传感器:" + temp);
                    break;
                case Sensor.TYPE_PROXIMITY:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 距离传感器:" + temp);
                    break;
                case Sensor.TYPE_ROTATION_VECTOR:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 旋转向量:" + temp);
                    break;
                case Sensor.TYPE_TEMPERATURE:
                    tv_view.setText(tv_view.getText().toString() + s.getType()
                            + " 温度传感器:" + temp);
                    break;
                default:
                    tv_view.setText(tv_view.getText().toString() + s.getType() + " 未知传感器:"
                            + temp);
                    break;
                }
            }
            
            // 在title上显示重力传感器的变化 
            sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            SensorEventListener lsn = new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent e) {
                    // TODO Auto-generated method stub
                    x = e.values[SensorManager.DATA_X];
                    y = e.values[SensorManager.DATA_Y];
                    z = e.values[SensorManager.DATA_Z];
                    setTitle("x=" + (int) x + "," + "y=" + (int) y + "," + "z="+ (int) z);
                }
                
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
                    // TODO Auto-generated method stub
                }
            };
            // 注册listener,第三个参数是检测的精确度   
            sm.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
        }
    
    }

    效果图:

  • 相关阅读:
    NOI 2016 区间 解题报告
    有关莫队
    [JSOI2008]最大数 线段树解法
    HDU P3341 Lost's revenge 题解+数据生成器
    BZOJ P1212 [HNOI2004] L语言
    洛谷P3168 [CQOI2015]任务查询系统
    普通平衡树Tyvj1728、luogu P3369 (splay)
    洛谷P3384 树链剖分
    BZOJ P2157 旅游
    【算法导论】第6章,堆排序
  • 原文地址:https://www.cnblogs.com/androidsj/p/3008351.html
Copyright © 2011-2022 走看看