当前位置: 代码迷 >> Android >> Android开发学习之路-传感器之初感受
  详细解决方案

Android开发学习之路-传感器之初感受

热度:113   发布时间:2016-04-24 11:41:21.0
Android开发学习之路--传感器之初体验

    说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等。当然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>

    添加LightSensor,AccelerSensor,MagnetiSensor的Activity,修改MainActivity代码如下:

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;            }        }    }}

    先要实现Light的功能,先修改布局如下:

<?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>

    简单地实现了一个textview用来显示光照强度。接着修改LightSensor代码如下:

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) {        }    };}

    这里先通过getSystemService获取sensor,然后通过注册一个listener来监听传感器的变化,当值有变化的时候会调用onSensorChanged方法,具体运行后,用手遮挡听筒附近的传感器,显示如下:

     

    从上可见光照的效果很明显了。接着我们来试下加速度传感器。这里实现微信摇一摇功能,并且成功了震动。

    修改布局如下:

<?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) {        }    };}

    这里的代码和LightSensor的代码差不多,主要是当三个方向的加速度大于19的时候就表示在摇动了,然后震动下手机就ok了。效果如下:

    

   最后来学习下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) {        }    };}

    这里通过加速度和磁传感器来实现一个方向,因为方向传感器官方已经不提倡使用了。运行效果如下:


    传感器就先学习这些了。


附:参考《第一行代码》

2楼u012904383前天 08:10
传感器,很实用的技术啊,学习了。
Re: eastmoon502136前天 08:11
回复u012904383n谢谢支持! ^_^
1楼u010850027前天 08:03
感谢小伙伴的分享,学习了`(*∩_∩*)′
Re: eastmoon502136前天 08:09
回复u010850027n^_^
  相关解决方案