Фоновая служба сердечного ритма останавливается после выключения экрана (Android/Java)Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Фоновая служба сердечного ритма останавливается после выключения экрана (Android/Java)

Сообщение Anonymous »

У меня есть приложение для умных часов, которое должно постоянно показывать мне частоту пульса. Он работает, когда экран включен, но как только экран гаснет, он просто перестает его читать. Если я включу экран, все журналы данных, которые должны были отображаться, появятся все вместе. Значит датчик работает? Он просто накапливается и не обрабатывается?
Извините, если код немного странный, я перепробовал так много вещей, что боюсь, что это ошибка устройства или что-то в этом роде. Устройство — Galaxy Watch 4.
При включенном экране:
Журнал правильности работы датчиков
Когда экран гаснет :
Ошибка появляется, когда экран гаснет.
А затем, если я открываю экран, они все появляются:
Когда экран включается, предыдущие журналы появляются мгновенно
Это домашнее задание, в котором я запускаю службу:
public class HomeActivity extends AppCompatActivity {

/* Monitor vars */
private Boolean screenIsFocused = getCurrentFocus() != null;
private TextView heartRateElement;
private TextView stepCountElement;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_home);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.home_layout), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});

defineIDsFunc();

/* Start sensor service */
startSensorServicesFunc();

/* Sensor data updates from shared preferences */
sensorDataUpdatesFunc();
}

/* Start sensor service */
public void startSensorServicesFunc() {
if (
((android.os.Build.VERSION.SDK_INT >= 33)?
(ContextCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS_BACKGROUND) == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS) == PackageManager.PERMISSION_GRANTED)
: (ContextCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS) == PackageManager.PERMISSION_GRANTED)
)
&& (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_GRANTED)
&& (ContextCompat.checkSelfPermission(this, Manifest.permission.FOREGROUND_SERVICE) == PackageManager.PERMISSION_GRANTED)
) {
startForegroundService(new Intent(this, SensorService.class));
} else {

if(android.os.Build.VERSION.SDK_INT >= 33) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BODY_SENSORS_BACKGROUND, Manifest.permission.BODY_SENSORS, Manifest.permission.ACTIVITY_RECOGNITION, Manifest.permission.FOREGROUND_SERVICE}, 123);
}else{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BODY_SENSORS, Manifest.permission.ACTIVITY_RECOGNITION, Manifest.permission.FOREGROUND_SERVICE}, 123);
}
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 100:
startSensorServicesFunc();
break;
}
}

/* Sensor data updates from shared preferences */
public void sensorDataUpdatesFunc() {
SharedPreferences.OnSharedPreferenceChangeListener listener = (
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (screenIsFocused) {
if (key.equals("heart-rate")) {
int hrTMP = sharedPreferences.getInt(key, 0);
heartRateElement.setText("HR: " + ((hrTMP > 0)? hrTMP : "-"));
}
if (key.equals("steps")) {
int stTMP = sharedPreferences.getInt(key, 0);
stepCountElement.setText("ST: " + ((stTMP > 0)? stTMP : "-"));
}
}
}
}
);

SharedPreferences bodySensorsPrefs = getSharedPreferences("body-sensors", MODE_PRIVATE);
bodySensorsPrefs.registerOnSharedPreferenceChangeListener(listener);
}

public void restartTextsFunc() {
heartRateElement.setText("HR: -");
stepCountElement.setText("ST: -");
}

/* Screen focus listener */
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) { screenIsFocused = true; restartTextsFunc(); }
else { screenIsFocused = false; }
}

private void defineIDsFunc() {
/* Sensor elements */
heartRateElement = findViewById(R.id.text_heart_rate);
stepCountElement = findViewById(R.id.text_steps_count);
}

А это услуга:
public class SensorService extends Service implements SensorEventListener {

private NotificationManager notificationManager;
private SensorManager sensorManager;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

NotificationChannel channel = new NotificationChannel("23", "SensorChannel", NotificationManager.IMPORTANCE_HIGH);
channel.setDescription("Sensor channel");
notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);

Intent notificationIntent = new Intent(this, HomeActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

Notification.Builder notification = new Notification.Builder(this, channel.getId())
.setOngoing(true)
.setContentTitle("Heart rate foreground service")
.setContentText("Heart rate foreground service enables the app to send your body sensor data at all times")
.setSmallIcon(R.drawable.icon_android)
.setContentIntent(pendingIntent);

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
notification.setForegroundServiceBehavior(Notification.FOREGROUND_SERVICE_IMMEDIATE);
}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
startForeground(51, notification.build());
} else {
if(android.os.Build.VERSION.SDK_INT >= 34) { startForeground(51, notification.build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_HEALTH); }
else { startForeground(51, notification.build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); }
}

/* Start sensors */
if (sensorManager == null) {
sensorManager = ((SensorManager) getSystemService(SENSOR_SERVICE));
startBodyListenerFunc();
}

return super.onStartCommand(intent, flags, startId);
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onTaskRemoved(Intent rootIntent) {
Intent restartServiceIntent = new Intent(getApplicationContext(),this.getClass());
restartServiceIntent.setPackage(getPackageName());
startService(restartServiceIntent);
super.onTaskRemoved(rootIntent);
}

/* Start sensor listeners*/
public void startBodyListenerFunc() {
Sensor mHeartRateSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
sensorManager.registerListener(this, mHeartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);

Sensor mStepCountSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
sensorManager.registerListener(this, mStepCountSensor, SensorManager.SENSOR_DELAY_NORMAL);
}

/* Listeners */
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}

public void onSensorChanged(SensorEvent event) {
Log.d("TEST", " \n \nSENSOR CHANGED ");

if (event.sensor.getType() == Sensor.TYPE_HEART_RATE) { saveAndSyncData("heart-rate", (int)event.values[0]); }
else if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) { saveAndSyncData("steps", (int)event.values[0]); }
else { Log.e("TEST", "Unknown sensor type \n \n "); }
}

public void saveAndSyncData(String key, Integer value) {
SharedPreferences.Editor editor = getSharedPreferences("body-sensors", MODE_PRIVATE).edit();
editor.putInt(key, value);
editor.apply();

Log.d("TEST", "KEY: " + key + "-data VAL: " + value + " \n \n ");

new MyWearableListenerService().sendMessage("/" + key + "-data", ""+value, getApplicationContext());
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... droid-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»