Проблемы с SensorManager в WearOS - PullRequest
       28

Проблемы с SensorManager в WearOS

0 голосов
/ 17 декабря 2018

Я пытаюсь получить данные акселерометра, но я не могу получить их, когда захочу.Я хочу 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 миллисекунд, но я получил намного больше.

1 Ответ

0 голосов
/ 17 декабря 2018

Я осматриваюсь и с 2016 года нашел отчеты о том, что в WearOS не имеет значения код, который вы пытаетесь здесь:

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

Неважно, используете ли вы

 mSensorManager.registerListener(this, mAcceSensor, SensorManager.SENSOR_DELAY_UI);

или mSensorManager.registerListener (this, mAcceSensor, SensorManager.SENSOR_DELAY_FASTEST);

или мой код, это всегдаиспользует самую быструю возможную частоту дискретизации, около 100 Гц.

Galaxy Nexus: частота выборки датчика увеличивается при выборке большего количества датчиков

частота выборки датчика Android выиграна 't дроу ниже 60 Гц

В конце я выбрал унылый способ:

@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 Гц.Я также попытался перейти с SENSOR_DELAY_UI на SENSOR_DELAY_FASTEST и получаю одинаковые результаты, 16-17 Гц, поэтому выбор не имеет значения.

Надеюсь, это поможет кому-то с такой же проблемой, и если естьболее стильный способ, я буду читать.

...