#android #wear-os #android-wear-2.0 #android-wear-notification #wearables
#Android #wear-os #android-wear-2.0 #android-wear-уведомление #носимые устройства
Вопрос:
Я хочу написать программу для Wear OS, которая ежедневно записывает частоту сердечных сокращений каждые 30 минут и сохраняет эти данные в текстовом файле. Я пытался использовать планировщик заданий, но он не работает постоянно. На самом деле это работает только один раз. Какую службу или API я должен использовать? Приложение будет работать в фоновом режиме и иногда обнаруживает слишком высокую частоту сердечных сокращений. Я использую Huawei Watch 2 LEO-BX9 (API 25)
Моя активность:
public class MainActivity extends WearableActivity {
private TextView output;
private int counter;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
output = (TextView) findViewById(R.id.output);
getPermissions();
}
public void scheduleJob(View v) {
ComponentName componentName = new ComponentName(this, ExampleJobService.class);
JobInfo info = new JobInfo.Builder(123, componentName)
//.setRequiresCharging(true)
//.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.setPeriodic(30 * 60 * 1000)
.setRequiresBatteryNotLow(true)
.build();
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = scheduler.schedule(info);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d(TAG, "Job scheduled");
} else {
Log.d(TAG, "Job scheduling failed");
}
}
public void cancelJob(View v) {
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.cancel(123);
Log.d(TAG, "Job cancelled");
}
public void getPermissions() {
String[] permission1 = {Manifest.permission.BODY_SENSORS};
if (ContextCompat.checkSelfPermission(this, permission1[0]) != 0) {
ActivityCompat.requestPermissions(this, permission1, PermissionInfo.PROTECTION_DANGEROUS);
Log.d("PERMISSIONS:", "requested, " ContextCompat.checkSelfPermission(this, permission1[0]));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M amp;amp; checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);
}
}
}
Мой сервис:
public class ExampleJobService extends JobService implements SensorEventListener {
int counter = 0;
private static final String TAG = "ExampleJobService";
private boolean jobCancelled = false;
private SensorManager sensorManager;
private Sensor hrSensor;
private double heartRate;
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "Job started");
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
hrSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
doBackgroundWork(params);
return true;
}
private void doBackgroundWork(final JobParameters params) {
sensorsOn();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i ) { // czas musi być powyżej 10 sekund aby czujnik się uruchomił
Log.d(TAG, "run: " i);
measure();
if (jobCancelled) {
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
counter ;
Log.d(TAG, "Job finished");
Log.d(TAG, "counter: " counter);
sensorsOff();
jobFinished(params, false);
}
}).start();
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG, "Job cancelled before completion");
jobCancelled = true;
return true;
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
Sensor sensor = sensorEvent.sensor;
if (sensor.getType() == Sensor.TYPE_HEART_RATE) {
heartRate = Double.valueOf(sensorEvent.values[0]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void sensorsOn() {
sensorManager.registerListener(this, hrSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public void sensorsOff() {
sensorManager.unregisterListener(this, hrSensor);
}
public void measure() {
sensorsOn();
Log.d(TAG, "hr: " heartRate);
}
}