WearOS 中 SensorManager 的问题
Problems with SensorManager in WearOS
我正在尝试获取加速度计数据,但无法在需要时获取。我想要每秒讲 20 次或多或少,这并不重要。问题是我收到的方式更多,比如尽可能多。我一直在查看文档,但我仍然得到每秒 100 次实现。这是代码:
public class MainActivity extends WearableActivity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mAcceSensor;
private final static String TAG = "Wear MainActivity";
private TextView mTextView;
private Button myButton;
private ToggleButton activateSensors;
private int num = 1;
public boolean isOn;
private String datapath = "/message_path";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mTextView = findViewById(R.id.text);
//send a message from the wear. This one will not have response.
myButton = findViewById(R.id.wrbutton);
activateSensors = findViewById(R.id.toggleButton);
activateSensors.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked) isOn = true;
else isOn = false;
}
});
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = "Hello device " + num;
//Requires a new thread to avoid blocking the UI
new SendThread(datapath, message).start();
num++;
}
});
// Register the local broadcast receiver to receive messages from the listener.
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
MessageReceiver messageReceiver = new MessageReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mAcceSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// Enables Always-on
setAmbientEnabled();
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAcceSensor,
50000, 50000);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this, mAcceSensor);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
String msg = Float.toString(sensorEvent.values[0]) +","+ Float.toString(sensorEvent.values[1]) +","+ Float.toString(sensorEvent.values[2])+","+getCurrentTimeStamp();
if (isOn){
new SendThread(datapath, msg).start();
}
}
}
public static String getCurrentTimeStamp(){
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentDateTime = dateFormat.format(new Date()); // Find todays date
return currentDateTime;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
(Now a block about sending from one device to the other)
}
如您所见,我将侦听器定义为:mSensorManager.registerListener(this, mAcceSensor,
50000, 50000);
那应该每 50 毫秒给我一个实现,但我得到的更多。
我一直在四处寻找,发现自 2016 年以来的报告表明,在 WearOS 中,您在此处尝试的代码并不重要:
mSensorManager.registerListener(这个, mAcceSensor, 50000, 50000);
用了没关系
mSensorManager.registerListener(this, mAcceSensor, SensorManager.SENSOR_DELAY_UI);
或
mSensorManager.registerListener(这, mAcceSensor, SensorManager.SENSOR_DELAY_FASTEST);
或者我的代码,它总是使用最快的采样率,大约 100 Hz。
Galaxy Nexus: Sensor Sampling Rate becomes faster when sampling more Sensors
最后我选择了一个低俗的方式:
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
nowDate = new Date();
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
String msg = Float.toString(sensorEvent.values[0]) +","+ Float.toString(sensorEvent.values[1]) +","+ Float.toString(sensorEvent.values[2]);
if (isOn && (nowDate.getTime() -startDate.getTime()) >= 40){
startDate = nowDate;
String timeStamp = dateFormat.format(nowDate);
msg = msg +","+timeStamp;
new SendThread(datapath, msg).start();
}
}
}
它有效,虽然不完美,但已经足够好了。似乎我在 if 条件中选择的值并不重要,我已经尝试了 40、50 和 60,并且都几乎完美地达到了 16-17Hz。我也尝试过从 SENSOR_DELAY_UI 更改为 SENSOR_DELAY_FASTEST,我得到了相同的结果,始终是 16-17Hz,所以这不是选择的问题。
我希望这对遇到同样问题的人有所帮助,如果有更时尚的做法,我会阅读。
我正在尝试获取加速度计数据,但无法在需要时获取。我想要每秒讲 20 次或多或少,这并不重要。问题是我收到的方式更多,比如尽可能多。我一直在查看文档,但我仍然得到每秒 100 次实现。这是代码:
public class MainActivity extends WearableActivity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mAcceSensor;
private final static String TAG = "Wear MainActivity";
private TextView mTextView;
private Button myButton;
private ToggleButton activateSensors;
private int num = 1;
public boolean isOn;
private String datapath = "/message_path";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mTextView = findViewById(R.id.text);
//send a message from the wear. This one will not have response.
myButton = findViewById(R.id.wrbutton);
activateSensors = findViewById(R.id.toggleButton);
activateSensors.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked) isOn = true;
else isOn = false;
}
});
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = "Hello device " + num;
//Requires a new thread to avoid blocking the UI
new SendThread(datapath, message).start();
num++;
}
});
// Register the local broadcast receiver to receive messages from the listener.
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
MessageReceiver messageReceiver = new MessageReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mAcceSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// Enables Always-on
setAmbientEnabled();
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAcceSensor,
50000, 50000);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this, mAcceSensor);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
String msg = Float.toString(sensorEvent.values[0]) +","+ Float.toString(sensorEvent.values[1]) +","+ Float.toString(sensorEvent.values[2])+","+getCurrentTimeStamp();
if (isOn){
new SendThread(datapath, msg).start();
}
}
}
public static String getCurrentTimeStamp(){
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentDateTime = dateFormat.format(new Date()); // Find todays date
return currentDateTime;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
(Now a block about sending from one device to the other)
}
如您所见,我将侦听器定义为:mSensorManager.registerListener(this, mAcceSensor, 50000, 50000);
那应该每 50 毫秒给我一个实现,但我得到的更多。
我一直在四处寻找,发现自 2016 年以来的报告表明,在 WearOS 中,您在此处尝试的代码并不重要:
mSensorManager.registerListener(这个, mAcceSensor, 50000, 50000);
用了没关系
mSensorManager.registerListener(this, mAcceSensor, SensorManager.SENSOR_DELAY_UI);
或 mSensorManager.registerListener(这, mAcceSensor, SensorManager.SENSOR_DELAY_FASTEST);
或者我的代码,它总是使用最快的采样率,大约 100 Hz。
Galaxy Nexus: Sensor Sampling Rate becomes faster when sampling more Sensors
最后我选择了一个低俗的方式:
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
nowDate = new Date();
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
String msg = Float.toString(sensorEvent.values[0]) +","+ Float.toString(sensorEvent.values[1]) +","+ Float.toString(sensorEvent.values[2]);
if (isOn && (nowDate.getTime() -startDate.getTime()) >= 40){
startDate = nowDate;
String timeStamp = dateFormat.format(nowDate);
msg = msg +","+timeStamp;
new SendThread(datapath, msg).start();
}
}
}
它有效,虽然不完美,但已经足够好了。似乎我在 if 条件中选择的值并不重要,我已经尝试了 40、50 和 60,并且都几乎完美地达到了 16-17Hz。我也尝试过从 SENSOR_DELAY_UI 更改为 SENSOR_DELAY_FASTEST,我得到了相同的结果,始终是 16-17Hz,所以这不是选择的问题。
我希望这对遇到同样问题的人有所帮助,如果有更时尚的做法,我会阅读。