0

私は人間活動認識 Android アプリケーションを開発しており、座っている時間 (静的) とアクティブに過ごした時間の両方を測定する必要があります。最初は、sharedPreferences に long 変数を格納し、5 秒ごとに (ユーザー アクティビティを 5 秒ごとに分類しています) 5000 (ミリ秒で 5 秒) ずつインクリメントすることを考えました。

ただし、サービスを開始し (バックグラウンド サービスを使用して分類を行い、それを SharedPreferences に保存しています)、後で確認すると、たとえば 2 時間後に、sharedPreferences にある時間と実際の時間が表示されます。合格率が大きく異なります。たとえば、午後 12 時にサービスを開始し、午後 2 時に確認すると、共有設定の値は 40 分程度になります (ミリ秒から値/1000/60 分に変換した場合)。

PS: 私のサービスは次のようになります。

public class MyService extends Service implements SensorEventListener {
public static final String COUNTER_KEY = "counterKey3";
public int counter = 0;
private static final long WINDOW_LENGTH = 5000;
private long windowBegTime = -1;
private SensorManager mSensorManager;
private Sensor accSensor;
private ArrayList<Double> xValues = new ArrayList<>();
private ArrayList<Double> yValues = new ArrayList<>();
private ArrayList<Double> zValues = new ArrayList<>();

private SharedPreferences mSharedPreferences;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    accSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_GAME);
    return START_STICKY;
}

@Override
public void onCreate() {
    super.onCreate();
    mSharedPreferences = getSharedPreferences(getPackageName(), MODE_PRIVATE);
    counter = mSharedPreferences.getInt(COUNTER_KEY, 0);

}


@Override
public void onSensorChanged(SensorEvent sensorEvent) {
    xValues.add((double) sensorEvent.values[0]);
    yValues.add((double) sensorEvent.values[1]);
    zValues.add((double) sensorEvent.values[2]);

    if (SystemClock.elapsedRealtime() - windowBegTime > WINDOW_LENGTH) {
        if (windowBegTime > 0) {
            mSharedPreferences.edit().putInt(COUNTER_KEY, mSharedPreferences.getInt(COUNTER_KEY, 0) + 5).apply();
            Log.i("MyService", "WindowTimeIssue! " + mSharedPreferences.getInt(COUNTER_KEY, 0));
                // DETECT ACTIVITY - store it in a db

        }

        windowBegTime = SystemClock.elapsedRealtime();
    }
}


}
4

1 に答える 1