I am doing fall detection in wear-os having fossil watch and getting fall detection in foreground and also used intent service to get fall detection in background but my watch app gets background service only for 1.30 mins. how to get continuous background service for fall detection in wear-os ? currently I am using this link for background service
this below code for background service and called intent service in main activity
public class FallDetectService extends Intent Service implements SensorEventListener
{
public static final boolean SERVERTRACE = false;
protected static final String TAG = "BackgroundLocationService";
private SensorManager sensorManager;
private Sensor accelerometer;
private Button button;
final static long TIME = 15000;
private FallDetectAlgo fallDetectAlgo;
// private Handler h0;
private boolean flag_fall = false;
private boolean flag_buffer_ready = false;
private ImageView image;
private boolean f_send_msg = true;
SharedPreferences sharedPreferences;
String watch_id;
SensorEvent event;
// private Intent mIntentService;
private PendingIntent mPendingIntent;
IBinder mBinder = new FallDetectService.LocalBinder();
public FallDetectService(){
super("Fall Service");
}
public FallDetectService(String name) {
super(name);
}
@SuppressLint("LongLogTag")
@Override
public void onCreate() {
Log.i(TAG, "onCreate()");
if (SERVERTRACE) enableStrictMode(); // for socket handling in main loop
super.onCreate();
sharedPreferences = getApplicationContext().getSharedPreferences("USER", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("isUserLogin", true);
editor.commit();
watch_id = sharedPreferences.getString("key_watch_id", "");
// start sample and analyze
fallDetectAlgo = new FallDetectAlgo();
fallDetectAlgo.setDaemon(true);
fallDetectAlgo.start();
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener((SensorEventListener) this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
} else {
Toast.makeText(this, "No Accelerometer Found!!",
Toast.LENGTH_LONG).show();
}
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
fallDetectAlgo = new FallDetectAlgo();
System.out.println("Service started");
fallDetectAlgo.setDaemon(true);
fallDetectAlgo.start();
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener((SensorEventListener) this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
} else {
Toast.makeText(this, "No Accelerometer Found!!",
Toast.LENGTH_LONG).show();
}
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
flag_buffer_ready = fallDetectAlgo.get_buffer_ready();
if (flag_buffer_ready) {
} else {
}
// store values in buffer and visualize fall
System.out.println("FallEvent flag " + fallDetectAlgo.set_data(event));
flag_fall = fallDetectAlgo.set_data(event); // event has values minus gravity
if (flag_fall) {
if (f_send_msg) {
f_send_msg = false;
}
System.out.println("Fall Event Fall detected success");
} else {
f_send_msg = true;
fallEventOccured();
}
}
public class LocalBinder extends Binder {
public FallDetectService getServerInstance() {
return FallDetectService.this;
}
}
private void fallEventOccured() {
StringRequest stringRequest = new StringRequest(Request.Method.POST, FALL_EVENT,
new Response.Listener<String>() {
@SuppressLint("LongLogTag")
@Override
public void onResponse(String response) {
Log.e("fallEventOccured response", "" + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("save_heart_rate error", "" + error);
Toast.makeText(getApplicationContext(), "Please try latter", Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("watch_id", "" + watch_id);
return params;
}
};
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);
}
@Override
public void onSensorChanged(SensorEvent event) {
// display if buffer is ready
flag_buffer_ready = fallDetectAlgo.get_buffer_ready();
if (flag_buffer_ready) {
} else {
}
// store values in buffer and visualize fall
System.out.println("FallEvent flag " + fallDetectAlgo.set_data(event));
flag_fall = fallDetectAlgo.set_data(event); // event has values minus gravity
if (flag_fall) {
if (f_send_msg) {
f_send_msg = false;
}
System.out.println("Fall Event Fall detected success");
fallEventOccured();
} else {
f_send_msg = true;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void enableStrictMode() {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
@SuppressLint("LongLogTag")
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "Service Stoped");
}
}