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(即 CSV)上保存和传输智能手表传感器数据的最佳方式是啥?