首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WearOS中的SensorManager问题

WearOS中的SensorManager问题
EN

Stack Overflow用户
提问于 2018-12-17 20:35:24
回答 1查看 266关注 0票数 0

我正在尝试获取加速度计的数据,但我无法在需要的时候获取它。我想要每秒20堂课,这并不重要。问题是我收到了更多的东西,比如最大可能的。我一直在看文档,但我每秒仍然能实现100次。代码如下:

代码语言:javascript
复制
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毫秒实现一次,但我得到的要多得多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 00:55:52

我一直在四处寻找,我发现自2016年以来,在WearOS中,你在这里尝试的代码并不重要:

mSensorManager.registerListener(this,mAcceSensor,50000,50000);

如果你使用了

代码语言:javascript
复制
 mSensorManager.registerListener(this, mAcceSensor, SensorManager.SENSOR_DELAY_UI);

或者mSensorManager.registerListener(this,mAcceSensor,SensorManager.SENSOR_DELAY_FASTEST);

或者我的代码,它总是使用最快的采样率,大约100 Hz。

Galaxy Nexus: Sensor Sampling Rate becomes faster when sampling more Sensors

Android sensor sampling rate won't drow below 60 hz

最后,我选择了一种低级的方式:

代码语言:javascript
复制
@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-17 the。我也尝试过从SENSOR_DELAY_UI到SENSOR_DELAY_FASTEST,我得到了相同的结果,16-17 to始终如一,所以这不是选择的问题。

我希望这对有同样问题的人有所帮助,如果有更时尚的方式,我会阅读。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53815390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档