#wear-os #accelerometer #sensors #background-service
#wear-os #акселерометр #датчики #фоновый сервис
Вопрос:
Я выполняю обнаружение падения в wear-os с fossil watch и получаю обнаружение падения на переднем плане, а также использую службу intent для обнаружения падения в фоновом режиме, но мое приложение watch получает фоновое обслуживание только в течение 1,30 минут. как получить непрерывный фоновый сервис для обнаружения падений в wear-os? в настоящее время я использую эту ссылку для фоновой службы
это приведенный ниже код для фоновой службы и вызываемая служба намерений в основной деятельности
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");
}
}