365連休

にわかのandroidとかの開発メモ。

ずっとSENSOR_STATUS_UNRELIABLEのAndroid搭載センサー(# ゚Д゚)

表題の通りです。

安定の踏み抜き率。

 

センサーから測定値を取得するには、大体次のようなSensorEventListenerになると思います。

 

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.accuracy == SensorManager.SENSOR_STATUS_NO_CONTACT) {
        return;
    }
    else if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
        return;
    }
    //測定値を利用するコード・・・
}

 

ずっとデータを取得できないセンサーがあるなあと思ったら、ずっとSENSOR_STATUS_UNRELIABLEのターンでした。

データが取れないからサンプルコードはみんなreturn voidなのかと思ってたけど、そういうセンサーがいるのでどうも違うみたいです。

 

そこで改めてevent.accuracyがどういう値をとるのかコンニャクほんやくしてみました。

 

/** センサーが触れていないため信頼できない */
public static final int SENSOR_STATUS_NO_CONTACT = -1;

/** センサーから返される値は信頼できないため、キャリブレーションが必要か、環境が測定を許可しない */
public static final int SENSOR_STATUS_UNRELIABLE = 0;

/** 低精度データであるため、環境に合わせたキャリブレーションが必要 */
public static final int SENSOR_STATUS_ACCURACY_LOW = 1;

/** 平均精度データ。環境に合わせたキャリブレーションは測定値を改善する */
public static final int SENSOR_STATUS_ACCURACY_MEDIUM = 2;

/** 最高精度データ */
public static final int SENSOR_STATUS_ACCURACY_HIGH = 3;

 

センサーから返される値は信頼できないため、

キャリブレーションが必要か、環境が測定を許可しない(?)

結局event.valuesに必ず値が入ってるのか確信が持てない・・・

-1は値が取れなかったっていうステータスにしてくれたらよかったのに。

ぬるぽチェックしたほうがいいのかな・・・そんなデバイスぬるぽで落ちてしまえ

 

2019/5/10追記:

SensorEventのJavaDocにあるサンプルコードではevent.accuracyをチェックするコードは一つもないので、特別な事情がない限りifでチェックしない方がいいのかも。
event.valuesには必ず値が入ってると思ってよさそう。

@Override
public void onSensorChanged(SensorEvent event) {
    //チェックする必要なし!
    //if (event.accuracy == SensorManager.SENSOR_STATUS_NO_CONTACT) {
    //    return;
    //}
    //else if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
    //    return;
    //}
    
    //測定値を利用するコード・・・
}