Пишу программу для записи в 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();
}
}