Задать вопрос
@RD1706D

Почему медленно считываются данные с акселерометра (Java, Android Studio)?

Пишу программу для записи в CSV файл данных с акселерометра, использую метод SensorDirectChannel и MemoryFile, однако скорость записи около 100 гц, несмотря на то что при использовании SensorDirectChannel скорость записи должна быть от 440 до 1760 гц. При этом сам датчик поддерживает около 1500 гц и при использовании SensorManager.SensorDelayFastest скорость записи около 400 гц. Как сделать скорость записи выше?

Мой код:
package com.example.api26;

import androidx.appcompat.app.AppCompatActivity;
import android.hardware.Sensor;
import android.hardware.SensorDirectChannel;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import android.os.MemoryFile;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sm = (SensorManager) getSystemService(SENSOR_SERVICE);

        textView1 = (TextView) findViewById(R.id.Values);

        list = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);

        try {
            mem = new MemoryFile("data", 1049);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (mem.length()>=1050){
            sdc = sm.createDirectChannel(mem);
        }

        if (list.size() > 0) {
            sm.registerListener(sel, (Sensor) list.get(0), SensorDirectChannel.RATE_VERY_FAST);
        } else {
            Toast.makeText(getBaseContext(), "Error: No Accelerometer.", Toast.LENGTH_LONG).show();
        }
    }

    MemoryFile mem;
    SensorManager sm = null;
    SensorDirectChannel sdc;
    TextView textView1 = null;
    List list;

    StringBuilder info = new StringBuilder();

    final SensorEventListener sel = new SensorEventListener() {
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }

        public void onSensorChanged(SensorEvent event) {
            float[] values = event.values;
            String result0 = String.format("x: " + "%.20f", values[0]);
            String result1 = String.format("y: " + "%.20f", values[1]);
            String result2 = String.format("z: " + "%.20f", values[2]);
            info.append(result0 + "\n" + result1 + "\n" + result2 + "\n");
            textView1.setText("x: " +  values[0] + "\ny: " + values[1] + "\nz: " + values[2] + "\n");


        }
    };


    @Override
    protected void onStop() {
        if (list.size() > 0) {
            sm.unregisterListener(sel);
        }
        super.onStop();
    }

    public void onstart(View view) {
        EditText editText = (EditText)findViewById(R.id.result);
        Toast.makeText(this, "LOG START!", Toast.LENGTH_SHORT).show();
        new Thread(() -> {
            int x = 0;
            while(x<1) {
                x++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            editText.post(() -> {
                editText.setText(info);
                try (PrintWriter out = new PrintWriter("storage/emulated/0/result.csv")) {
                    out.println(info);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                Toast.makeText(this, "LOG FINISH!", Toast.LENGTH_SHORT).show();

            });

        }).start();
        Toast.makeText(this, "1, 2", Toast.LENGTH_SHORT).show();
        Toast.makeText(this, "3, 4", Toast.LENGTH_SHORT).show();
    }
}
  • Вопрос задан
  • 145 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
textView1.setText на каждый чих плохо.
переделай чтобы обновлял не чаще 1го раза в 100мс
Ответ написан
Комментировать
alexgp13
@alexgp13
Руководитель ИТ-проектов
Похоже, это ограничение Android, который не отдает данные чаще. Аналогично с GPS, который только один раз в секунду можно считать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы