J'ai essayé de nombreuses façons d'obtenir des données de capteur en arrière-plan et de stocker la valeur dans une préférence partagée ou SQLite, mais aucune d'entre elles ne fonctionne. Je pense que c'est à cause des restrictions de fond Android Oreo.
j'ai essayé
et maintenant j'utilise le WorkManager. Cela ne fonctionne pas vraiment non plus. Qu'est-ce que je fais mal? Est-il impossible d'obtenir les données des capteurs en arrière-plan maintenant? Existe-t-il une autre solution alternative?
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localDatabaseHelper = new LocalDatabaseHelper(getApplicationContext());
sharedPreferences = getSharedPreferences("TEST STORAGE", MODE_PRIVATE);
sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE);
stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
WorkManager.getInstance(getApplicationContext()).cancelAllWorkByTag("Update-Shared-Preference");
WorkRequest updateSharedPreference = new OneTimeWorkRequest.Builder(UpdateStepWork.class)
.addTag("Update-Shared-Preference")
.build();
WorkManager.getInstance(getApplicationContext()).enqueue(updateSharedPreference);
}
Travail
public class UpdateStepWork extends Worker implements SensorEventListener {
private SharedPreferences sharedPreferences;
private SensorManager sensorManager;
private Sensor stepSensor;
private LocalDatabaseHelper localDatabase;
public UpdateStepWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.i("WORK", "STARTED");
sharedPreferences = getApplicationContext().getSharedPreferences("TEST STORAGE", Context.MODE_PRIVATE);
sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE);
stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
localDatabase = new LocalDatabaseHelper(getApplicationContext());
WorkManager.getInstance(getApplicationContext()).cancelAllWorkByTag("Update-Shared-Preference");
WorkRequest updateSharedPreference = new OneTimeWorkRequest.Builder(UpdateStepWork.class)
.setInitialDelay(5, TimeUnit.SECONDS)
.addTag("Update-Shared-Preference")
.build();
WorkManager.getInstance(getApplicationContext()).enqueue(updateSharedPreference);
sensorManager.unregisterListener(this, stepSensor);
if(sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL)){
return Worker.Result.success();
}else
return Worker.Result.failure();
}
@Override
public void onSensorChanged(SensorEvent event) {
int steps = (int) event.values[0];
Log.i("Steps from sensor", steps + "");
if(sharedPreferences.edit().putInt("steps", steps).commit()){
Log.i("Shared Preference", "SUCCESS STORED: " + steps);
if(localDatabase.updateDailyData(steps)){
Log.i("LOCAL DATABASE", "SUCCESS AT " + getCurrentTimeStamp());
Cursor data = localDatabase.getData();
while (data.moveToNext()) {
Log.i("DATA", data.getString(0) + " " + data.getInt(1));
}
}
}else{
Log.i("Shared Preference", "FAILED STORED: " + steps);
}
sensorManager.unregisterListener(this, stepSensor);
sensorManager = null;
}
L'approche typique pour collecter les données des capteurs en arrière-plan utilise un service de premier plan .
Les SharedPreferences ne sont pas un moyen idéal pour stocker les données des capteurs. Je vous recommande de stocker les données du capteur dans un fichier .csv ou une base de données.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots