说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等。当然android手机之所以称为智能手机,少不了这几款传感器的功劳了。下面就学习下了,这里主要学习光照,加速度和磁。
新建工程emSensorStudy,布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    android:layout_margin="5dp"
    tools:context="com.jared.emsensorsstudy.MainActivity">
    <TextView
        android:text="Hello Sensors"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="22dp"/>
    <Button
        android:id="@+id/startLightSensor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="启动LightSensor"
        android:textAllCaps="false"/>
    <Button
        android:id="@+id/startAccelerSensor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="启动AccelerSensor"
        android:textAllCaps="false"/>
    <Button
        android:id="@+id/startMagneticSensor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="启动MagneticSensor"
        android:textAllCaps="false"/>
</LinearLayout>
package com.jared.emsensorsstudy;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
    private Button startLightSensorBtn;
    private Button startAccelerSensorBtn;
    private Button startMagneticSensorBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startLightSensorBtn = (Button)findViewById(R.id.startLightSensor);
        startAccelerSensorBtn = (Button)findViewById(R.id.startAccelerSensor);
        startMagneticSensorBtn = (Button)findViewById(R.id.startMagneticSensor);
        startLightSensorBtn.setOnClickListener(new myOnClickListener());
        startAccelerSensorBtn.setOnClickListener(new myOnClickListener());
        startMagneticSensorBtn.setOnClickListener(new myOnClickListener());
    }
    private class myOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.startAccelerSensor:
                    Intent intent1 = new Intent(getApplicationContext(), AccelerSensor.class);
                    startActivity(intent1);
                    break;
                case R.id.startLightSensor:
                    Intent intent2 = new Intent(getApplicationContext(), LightSensor.class);
                    startActivity(intent2);
                    break;
                case R.id.startMagneticSensor:
                    Intent intent3 = new Intent(getApplicationContext(), MagneticSensor.class);
                    startActivity(intent3);
                    break;
                default:
                    break;
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:layout_margin="10dp"
    tools:context="com.jared.emsensorsstudy.LightSensor">
    <TextView
        android:id="@+id/light_level"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="22dp"/>
</LinearLayout>
package com.jared.emsensorsstudy;
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.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class LightSensor extends AppCompatActivity {
    private SensorManager sensorManager;
    private TextView lightLevel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_light_sensor);
        lightLevel = (TextView)findViewById(R.id.light_level);
        initWithLight();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(sensorManager != null) {
            sensorManager.unregisterListener(listener);
        }
    }
    public void initWithLight() {
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
    }
    private SensorEventListener listener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            float value = sensorEvent.values[0];
            lightLevel.setText("Currrent light level is "+value+"lx");
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
        }
    };
}
 
    
从上可见光照的效果很明显了。接着我们来试下加速度传感器。这里实现微信摇一摇功能,并且成功了震动。
修改布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    android:layout_margin="10dp"
    tools:context="com.jared.emsensorsstudy.AccelerSensor">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="摇一摇获取更多哦!"
        android:layout_gravity=""
        android:textSize="22dp"/>
    <TextView
        android:id="@+id/shack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="22dp"/>
</LinearLayout>
package com.jared.emsensorsstudy;
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.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class AccelerSensor extends AppCompatActivity {
    private SensorManager sensorManager;
    private TextView shackPhone;
    private Vibrator vibrator;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_acceler_sensor);
        shackPhone = (TextView)findViewById(R.id.shack);
        initWithAcceler();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(sensorManager != null) {
            sensorManager.unregisterListener(listener);
        }
    }
    private void initWithAcceler() {
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
        vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
    }
    private SensorEventListener listener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            float xValue = Math.abs(sensorEvent.values[0]);
            float yValue = Math.abs(sensorEvent.values[1]);
            float zValue = Math.abs(sensorEvent.values[2]);
            int medumValue = 19;
            if(xValue > medumValue || yValue > medumValue || zValue > medumValue) {
                vibrator.vibrate(200);
                shackPhone.setText("恭喜你摇一摇成功,新年快乐!");
            } else {
                //Toast.makeText(getApplicationContext(), "请使劲摇哦!", Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
        }
    };
}
 
   
最后来学习下magneticSensor了。这里实现个compass。首先就是提供一张图片了,修改布局如下:
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:layout_margin="10dp"
    tools:context="com.jared.emsensorsstudy.MagneticSensor">
    <ImageView
        android:id="@+id/compass_img"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerInParent="true"
        android:src="@drawable/compass" />
</RelativeLayout>
接着就是修改MagneticSensor的代码了:
package com.jared.emsensorsstudy;
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.support.v7.app.AppCompatActivity;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
public class MagneticSensor extends AppCompatActivity {
    private SensorManager sensorManager;
    private ImageView compassImage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_magnetic_sensor);
        compassImage = (ImageView)findViewById(R.id.compass_img);
        initWithCompass();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        sensorManager.unregisterListener(listener);
    }
    private void initWithCompass() {
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        Sensor acclerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(listener, acclerSensor, SensorManager.SENSOR_DELAY_GAME);
    }
    private SensorEventListener listener = new SensorEventListener() {
        float[] acclerValues = new float[3];
        float[] magneticValues = new float[3];
        private float lastRotateDegree;
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            switch (sensorEvent.sensor.getType()) {
                case Sensor.TYPE_ACCELEROMETER:
                    acclerValues = sensorEvent.values.clone();
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    magneticValues = sensorEvent.values.clone();
                    break;
                default:
                    break;
            }
            float[] values = new float[3];
            float[] R = new float[9];
            //调用getRotaionMatrix获得变换矩阵R[]  
            SensorManager.getRotationMatrix(R, null, acclerValues, magneticValues);
            SensorManager.getOrientation(R, values);
            //经过SensorManager.getOrientation(R, values);得到的values值为弧度
            //转换为角度
            float rotateDegree = -(float)Math.toDegrees(values[0]);
            if(Math.abs(rotateDegree - lastRotateDegree) > 2) {
                RotateAnimation animation = new RotateAnimation(
                  lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f,
                        Animation.RELATIVE_TO_SELF, 0.5f);
                animation.setFillAfter(true);
                compassImage.startAnimation(animation);
                lastRotateDegree = rotateDegree;
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
        }
    };
}
这里通过加速度和磁传感器来实现一个方向,因为方向传感器官方已经不提倡使用了。运行效果如下:
传感器就先学习这些了。
附:参考《第一行代码》
原文:http://blog.csdn.net/eastmoon502136/article/details/50707818