У меня есть приложение для умных часов, которое должно постоянно показывать мне частоту пульса. Он работает, когда экран включен, но как только экран гаснет, он просто перестает его читать. Если я включу экран, все журналы данных, которые должны были отображаться, появятся все вместе. Значит датчик работает? Он просто накапливается и не обрабатывается?
Извините, если код немного странный, я перепробовал так много вещей, что боюсь, что это ошибка устройства или что-то в этом роде. Устройство — 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
Фоновая служба сердечного ритма останавливается после ошибки DestroySurfaces (Android/Java) ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Фоновая служба сердечного ритма останавливается после ошибки DestroySurfaces (Android/Java)
Anonymous » » в форуме JAVA - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Фоновая служба сердечного ритма останавливается после выключения экрана (Android/Java)
Anonymous » » в форуме Android - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-