package com.example.android.recipe071;
import java.util.List;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class ProximityManager implements SensorEventListener {
// 近接センサーの変化を検知するリスナーです。
public interface OnProximityListener {
// センサーの値が変わったら呼び出されます。
void onSensorChanged(SensorEvent event);
// 遠ざかったら呼び出されます。
void onFar(float value);
// 近づいたら呼び出されます。
void onNear(float value);
}
private SensorManager mSensorManager;
private OnProximityListener mListener;
private float mPreValue = -1;
public ProximityManager(Context context) {
mSensorManager = (SensorManager)context.getSystemService(
Context.SENSOR_SERVICE);
}
public void setOnProximityListener(OnProximityListener listener) {
mListener = listener;
}
public void onResume() {
// 近接センサーを取得
List<Sensor> list =
mSensorManager.getSensorList(Sensor.TYPE_PROXIMITY);
// 取得できなければ何もしない
if (list.size() < 1) return;
// 近接センサーを取得
Sensor sensor = list.get(0);
// 近接センサーにリスナーを登録
// 第3引数で感度を指定できます。
mSensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
public void onPause() {
// リスナーを解除
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
// 近接センサー以外は何もしない。
if (event.sensor.getType() != Sensor.TYPE_PROXIMITY) {
return;
}
// 初回は何もしない
if (mPreValue == -1) {
mPreValue = event.values[0];
return;
}
float value = event.values[0];
if (value < mPreValue) {
// 前回より値が小さければ近づいたということなので
// リスナーのonNearメソッドを呼び出す。
if (mListener != null) mListener.onNear(value);
} else if (value > mPreValue) {
// 前回より値が大きければ遠ざかったということなので
// リスナーのonFarメソッドを呼び出す。
if (mListener != null) mListener.onFar(value);
}
// リスナーがセットされてれば
// onSensorChangedメソッドを呼び出す
if (mListener != null) mListener.onSensorChanged(event);
// 今回の値を保存
mPreValue = value;
}
}