Herzfrequenz-Hintergrunddienst stoppt nach destroySurfaces-Fehler (Android/Java)Android

Forum für diejenigen, die für Android programmieren
Guest
 Herzfrequenz-Hintergrunddienst stoppt nach destroySurfaces-Fehler (Android/Java)

Post by Guest »

Ich habe eine App für Smartwatches, die mir ständig die Herzfrequenz anzeigen soll. Es funktioniert, wenn der Bildschirm eingeschaltet ist, aber sobald der Bildschirm ausgeht, hört das Lesen einfach auf. Wenn ich den Bildschirm einschalte, werden alle Protokolle der Daten angezeigt, die angezeigt werden sollten. Also funktioniert der Sensor? Es sammelt sich nur an und wird nicht verarbeitet?
Entschuldigung, wenn der Code etwas seltsam ist, ich habe so viele Dinge ausprobiert, dass ich befürchte, dass es am Gerät oder an einem Problem liegt. Das Gerät ist eine Galaxy Watch 4.
Bei eingeschaltetem Bildschirm:
Protokoll der ordnungsgemäß funktionierenden Sensoren
Wenn der Bildschirm ausgeht :
Fehler erscheint, wenn der Bildschirm ausgeht
Und wenn ich dann den Bildschirm öffne, erscheinen alle:
Wenn der Bildschirm wieder eingeschaltet wird, werden die vorherigen Protokolle sofort angezeigt
Dies ist die Heimaktivität, bei der ich den Dienst starte:

Code: Select all

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);
}
Und das ist der Service:

Code: Select all

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());
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post