Как сохранить данные потокового датчика внутри на Android? - PullRequest
0 голосов
/ 18 марта 2020

Приветствия. Я относительно новичок в Android программировании. Я пытался реализовать приложение, которое считывает данные датчика (акселерометр + гироскоп), а затем сохраняет их внутри с помощью нажатия кнопки. Я был в состоянии получить показания от датчика успешно. Однако только одна строка данных сохраняется в формате файла, который показывает только текущие данные, а предыдущие данные были перезаписаны. Пожалуйста, обратитесь сюда для вывода . Таким образом, мне нужна помощь, чтобы это исправить.

В MainActivity. java, я зарегистрировал прослушиватель датчиков:

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub
}

// Obtain the sensor data from the phone
boolean IsDataRequested = false;
@Override
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

        if (IsDataRequested == true){

            Log.d("Accelerometer", "Acc_X:" + event.values[0] + "Acc_Y:" + event.values[1] + "Acc_Z:" + event.values[2]);

            AccXText.setText("AccX:" + event.values[0]);
            AccYText.setText("AccY:" + event.values[1]);
            AccZText.setText("AccZ:" + event.values[2]);

            save(event);
        }
    }

    if (sensor.getType() == Sensor.TYPE_GYROSCOPE) {

        if (IsDataRequested == true) {

            Log.d("Gyroscope", "Gyro_X:" + event.values[0] + "Gyro_Y:" + event.values[1] + "Gyro_Z:" + event.values[2]);
            GyroXText.setText("GyroX:" + event.values[0]);
            GyroYText.setText("GyroY:" + event.values[1]);
            GyroZText.setText("GyroZ:" + event.values[2]);

            save(event);
        }
    }

}

Затем в том же файле я создал метод сохранения:

public void save(SensorEvent v) {
    float Acc_X = v.values[0];
    float Acc_Y = v.values[1];
    float Acc_Z = v.values[2];

    float Gyro_X = v.values[0];
    float Gyro_Y = v.values[1];
    float Gyro_Z = v.values[2];

    String accString = "Acc=" + "X:" + Acc_X + "Y:" + Acc_Y + "Z:" + Acc_Z;
    String gyroString = "Gyro=" + "X:" + Gyro_X + "Y:" + Gyro_Y + "Z:" + Gyro_Z;

    String FILENAME = "user";

    FileOutputStream fos = null;
    try {
        fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try {
        fos.write(accString.getBytes());
        fos.write(gyroString.getBytes());
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Нажмите кнопку, чтобы начать и остановить отправку данных:

private OnClickListener myOnSensorsRequestClickHandler = new OnClickListener() {
    @Override
            public void onClick(View sensors) {

            IsDataRequested = !IsDataRequested;
            Log.d("Sensors", "Sensors Button Pressed");

    }
};

Мои цели:

  1. Кому непрерывно сохраняйте поток данных датчика, пока та же кнопка не будет нажата, чтобы прекратить считывание данных, затем они будут сохранены в одном файле.

  2. При следующем запуске и остановке нажатия кнопки , он добавит еще один сохраненный файл, так что я могу иметь несколько файлов в одной папке.

Любая помощь или совет очень ценится:)

1 Ответ

0 голосов
/ 18 марта 2020

Надеюсь, что приведенное ниже предложение полезно для ваших требований ниже

    private OnClickListener myOnSensorsRequestClickHandler = new OnClickListener() {
    @Override
            public void onClick(View sensors) {

            IsDataRequested = !IsDataRequested;
            Log.d("Sensors", "Sensors Button Pressed");

            if(IsDataRequested)
            {
            //Create file name when start service button was clicked
        FILENAME = "user"+new Date().getTime() + ".txt"; //Here FILENAME is a path of file in global variable
        }

    }};



    boolean IsDataRequested = false;
    @Override
    public void onSensorChanged(SensorEvent event) {
        Sensor sensor = event.sensor;
        if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

            if (IsDataRequested == true){



                Log.d("Accelerometer", "Acc_X:" + event.values[0] + "Acc_Y:" + event.values[1] + "Acc_Z:" + event.values[2]);

                AccXText.setText("AccX:" + event.values[0]);
                AccYText.setText("AccY:" + event.values[1]);
                AccZText.setText("AccZ:" + event.values[2]);

                save(FILENAME, event);
            }
            else
            {

            }
        }

        if (sensor.getType() == Sensor.TYPE_GYROSCOPE) {

            if (IsDataRequested == true) {

                Log.d("Gyroscope", "Gyro_X:" + event.values[0] + "Gyro_Y:" + event.values[1] + "Gyro_Z:" + event.values[2]);
                GyroXText.setText("GyroX:" + event.values[0]);
                GyroYText.setText("GyroY:" + event.values[1]);
                GyroZText.setText("GyroZ:" + event.values[2]);

                save(FILENAME, event);
            }
        }

    }
    public void save(String FILENAME, SensorEvent v) {
        float Acc_X = v.values[0];
        float Acc_Y = v.values[1];
        float Acc_Z = v.values[2];

        float Gyro_X = v.values[0];
        float Gyro_Y = v.values[1];
        float Gyro_Z = v.values[2];


//Here used StringBuffer instead of string for append string data

        StringBuffer accQyroData = "========";
        accQyroData.append("Acc=" + "X:" + Acc_X + "Y:" + Acc_Y + "Z:" + Acc_Z"+"\n"+"Gyro=" + "X:" + Gyro_X + "Y:" + Gyro_Y + "Z:" + Gyro_Z);
        accQyroData.append("========");

        //Use Stream for java append to file when you are dealing with raw data, binary
        appendUsingFileOutputStream(FILENAME, accQyroData);
    }

        /**
         * Use Stream for java append to file when you are dealing with raw data, binary
         * data
         * 
         * @param data
         */
        private static void appendUsingFileOutputStream(String fileName, String data) {
            OutputStream os = null;
            try {
                // below true flag tells OutputStream to append
                os = new FileOutputStream(new File(fileName), true);
                os.write(data.getBytes(), 0, data.length());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
  • Чтобы поток данных датчика сохранялся непрерывно до тех пор, пока не будет нажата одна и та же кнопка, чтобы прекратить чтение данных, они будут сохранены в одном файле.
  • При следующем запуске и прекращении нажатия кнопки будет добавлен еще один сохраненный файл, чтобы в одной папке могло быть несколько файлов.
...