うわー、わかりました、これは確かにバグです!
各SensorEventのタイムスタンプは、静的変数であるかのように上書きされます。
イベントが発生したときにタイムスタンプの文字列を記録すると、すべての値が異なります。
イベントは変更されずに配列に格納されます。
配列内のすべてのSensorEventのタイムスタンプは同じになりましたが、値の配列はまだ異なります(つまり、同じオブジェクトではなく、タイムスタンプを除いて異なる情報が含まれています)。
Google / HTC、私の人生の3時間を返してください!
誰かがこの振る舞いを説明できない限り、私はバグレポートを提出します。それは確かにAPIに文書化されていません。
それまでの間、このソリューションを試してみてください。
import android.hardware.Sensor;
import android.hardware.SensorEvent;
public class UnbrokenSensorEvent {
public long timestamp;
public float[] values;
public Sensor sensor;
public UnbrokenSensorEvent(SensorEvent event){
this.timestamp = event.timestamp;
this.values = event.values;
this.sensor = event.sensor;
}
}
次に、リスナーで次のようなことを行います。
ArrayList<UnbrokenSensorEvent> results = new ArrayList<UnbrokenSensorEvent>();
public void onSensorChanged(SensorEvent event) {
results.add(new UnbrokenSensorEvent(event));
}
SensorEventとUnbrokenSensorEventのパブリックフィールドは同じであるため、リファクタリングは非常に簡単です。他のSensorEvent機能を使用する必要がある場合は、先に進んでUnbrokenバージョンにチャックしてください。
ハッキーですが、APIが更新されるのを待つよりも、IMHOのクイックハックの方が常に優れています。