m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

android5.xで加速度センサーで振動を検知?

加速度センサーには重力が含まれているので細かい振動はそのままでは検知できない

らしい

やること

  1. 重力を差し引いた値を検出
  2. 一定のしきい値を超えた場合に背景の色を変更する

というものを作ってみる

画面

activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:id="@+id/layout1">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text1"
        android:textSize="32dp" />

</RelativeLayout>

※振っている際の値を読みきれないので少し文字サイズを大きめにしてみる

実装

MainActivity
package jp.mshige1979.app.samplesensor04;

import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import org.w3c.dom.Text;


public class MainActivity extends Activity {

    // センサーマネージャー
    private SensorManager manager;

    // センサーイベントリスナー
    private SensorEventListener listener;

    // テキストビュー
    TextView textView1 = null;

    // 今回の加速度
    private float fAccell[] = new float[3];

    private float gravity[] = { 0.0f, 0.0f, 0.0f };
    private float[] linear_acceleration = { 0.0f, 0.0f, 0.0f };

    private final float alpha = 0.8f;
    private RelativeLayout layout1 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        layout1 = (RelativeLayout)findViewById(R.id.layout1);

        // センサーマネージャーを取得
        manager = (SensorManager)getSystemService(SENSOR_SERVICE);

        // センサーのイベントリスナーを登録
        listener = new SensorEventListener() {

            // 値変更時
            @Override
            public void onSensorChanged(SensorEvent sensorEvent) {

                // センサーの種類で値を取得
                switch( sensorEvent.sensor.getType()) {
                    // 加速度
                    case Sensor.TYPE_ACCELEROMETER:
                        fAccell = sensorEvent.values.clone();

                        gravity[0] = alpha * gravity[0] + (1 - alpha) * fAccell[0];
                        gravity[1] = alpha * gravity[1] + (1 - alpha) * fAccell[1];
                        gravity[2] = alpha * gravity[2] + (1 - alpha) * fAccell[2];

                        linear_acceleration[0] = fAccell[0] - gravity[0];
                        linear_acceleration[1] = fAccell[1] - gravity[1];
                        linear_acceleration[2] = fAccell[2] - gravity[2];

                        //layout1.setBackgroundColor(Color.TRANSPARENT);
                        if(linear_acceleration[0] >= 1.5f){
                            layout1.setBackgroundColor(Color.BLUE);
                        }
                        if(linear_acceleration[1] >= 1.5f){
                            layout1.setBackgroundColor(Color.YELLOW);
                        }
                        if(linear_acceleration[2] >= 1.5f){
                            layout1.setBackgroundColor(Color.GREEN);
                        }

                        String str = "";
                        str += "加速度センサー(重力あり)\n"
                                + "X:" + Math.abs(fAccell[0]) + "\n"
                                + "Y:" + Math.abs(fAccell[1]) + "\n"
                                + "Z:" + Math.abs(fAccell[2]) + "\n";
                        str += "\n\n";
                        str += "加速度センサー(重力除去)\n"
                                + "X:" + Math.abs(linear_acceleration[0]) + "\n"
                                + "Y:" + Math.abs(linear_acceleration[1]) + "\n"
                                + "Z:" + Math.abs(linear_acceleration[2]) + "\n";
                        textView1.setText(str);

                        break;
                }

            }

            //
            @Override
            public void onAccuracyChanged(Sensor sensor, int i) {

            }
        };

        // text
        textView1 = (TextView)findViewById(R.id.text1);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // リスナー設定:加速度
        manager.registerListener(
                listener,
                manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_UI);

    }


    @Override
    protected void onPause() {
        super.onPause();

        // リスナー解除
        manager.unregisterListener(listener);
    }
}

※振った場合に背景の色が変わるようにしてみた。

結果

f:id:m_shige1979:20150711064428p:plain

所感

しきい値の値の基準が自分のスマホのベースなのでそれぞれのスマホで再調整がいる感じになるかも。ただ、重力?という値を差し引いて検出するのは少しおもしろいかも…