Android Wear OS 在后台检索计步器

Posted

技术标签:

【中文标题】Android Wear OS 在后台检索计步器【英文标题】:Android wear OS retrieving stepcounter in background 【发布时间】:2022-01-01 21:14:13 【问题描述】:

我正在尝试从智能手表中检索步数并将其推送到 API。当我打开应用程序时,我能够检索和推送数据。但是一旦它没有被激活,那么它就不会发送任何数据。我正在尝试使用 android 服务在后台运行应用程序,以便它可以连续发送数据。我已授予所有权限并启用它们。

这是 MainActivity.java

package com.example.stepcounter;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent; 
import android.os.Bundle;
public class MainActivity extends AppCompatActivity
  protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

 
 protected void onResume() 
    super.onResume();

protected void onPause() 
    super.onPause();

protected void onDestroy() 
    super.onDestroy();


public void onPressStartService(View v)

    Intent intent = new Intent(this, MyService.class);

    startService(intent);

public void onPressStopService(View v)
    stopService(new Intent(getApplicationContext(), MyService.class));
 

 

这是 MyService.java

package com.example.stepcounter;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.TextView;

import androidx.annotation.Nullable;

 import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

public class MyService extends Service implements SensorEventListener 
 private SensorManager mSensorManager;
 private Sensor mSensor;
 private String HelloData;
 private TextView mTextView;
 private boolean isSensorPresent;

@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    mSensorManager = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);
    if(mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE) != null) 
        mSensor = mSensorManager.getDefaultSensor(69680);
        isSensorPresent = true;
     else 
        isSensorPresent = false;
    
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
    return START_STICKY;


@Nullable
@Override
public IBinder onBind(Intent intent) 
    return null;


@Override
public void onSensorChanged(SensorEvent event) 
    mTextView.setText("Heart Rate:  " + String.valueOf(event.values[0]));
    HelloData = (String) String.valueOf(event.values[0]);
    if(!HelloData.contains("0.0"))
        postDataUsingVolley(HelloData);
    


@Override
public void onAccuracyChanged(Sensor sensor, int i) 



private void postDataUsingVolley(String ranData) 
    String url = "https://test.com";
    RequestQueue queue = Volley.newRequestQueue(this);
    JSONObject postData = new JSONObject();

    try 
        postData.put("data", ranData);

     catch (JSONException e) 
        e.printStackTrace();
    
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, postData, new Response.Listener<JSONObject>() 
        @Override
        public void onResponse(JSONObject response) 
            System.out.println(response);
        
    , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 
            error.printStackTrace();
        
    );

    queue.add(jsonObjectRequest);
   
 

我还在 AndroidManifest.xml 中添加了以下内容

   <service
        android:name=".MyService"
        android:enabled="true"
        android:exported="true"></service>

它工作 30 秒,发送数据,一旦手表处于非活动状态,它就会停止发送数据。知道这有什么问题吗?

【问题讨论】:

不是android专家,但也许你的MainApp需要做的不仅仅是在恢复时调用super方法? 【参考方案1】:

您需要在onPause 期间注销您的传感器:

@Override
protected void onPause() 
    super.onPause();
    sensorManager.unregisterListener(this);

另外,如果您取消注册,您需要使用您的boolean activityRunning

【讨论】:

以上是关于Android Wear OS 在后台检索计步器的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Wear OS 的后台运行服务,通过 WiFi/LTE 不断发送心率数据吗?

Android Wear OS 关闭 Wifi

在 Android Wear OS(即 CSV)上保存和传输智能手表传感器数据的最佳方式是啥?

从 Wear 应用程序启动 OS 的连接屏幕

Wear OS 更新一览 | 2021 Android 开发者峰会

Android超精准计步器开发-Dylan计步