How to get response of accelerometer sensor in background in wear os?

Viewed 185

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

   
}

https://github.com/alessandror/AndroidFallDetectionApp

0 Answers
Related