I am very new to Java & Android but I need to write a txt file which contains sensor data in Environment.DIRECTORY_DOCUMENTS. I scanned questions about it and tried examples. Version used here is Android 5.1 (API 22). My final trial is here:
package com.example.accgy;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.TextView;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private static final String TAG = "MainActivity";
private SensorManager sensorManager;
Sensor accelerometer;
Sensor gyroscope;
FileWriter writer;
TextView Xa,Ya,Za,Xg,Yg,Zg;
float[] accel = new float[3];
float[] gyro = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Xa = (TextView)findViewById(R.id.Xa);
Ya = (TextView)findViewById(R.id.Ya);
Za = (TextView)findViewById(R.id.Za);
Xg = (TextView)findViewById(R.id.Xg);
Yg = (TextView)findViewById(R.id.Yg);
Zg = (TextView)findViewById(R.id.Zg);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
public void onStart(View view){
super.onStart();
sensorManager.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this,gyroscope,SensorManager.SENSOR_DELAY_NORMAL);
String savedirect = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).toString();
try {
File folder = new File(savedirect,"/example.txt");
folder.mkdir();
writer = new FileWriter(folder);
} catch (IOException e) {
e.printStackTrace();
}
}
public void onStop(View view) {
super.onStop();
sensorManager.unregisterListener(this);
try {
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
accel = sensorEvent.values;
Xa.setText("Xa: " + accel[0]);
Ya.setText("Ya: " + accel[1]);
Za.setText("Za: " + accel[2]);
}
if (sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
gyro = sensorEvent.values;
Xg.setText("Xg: " + gyro[0]);
Yg.setText("Yg: " + gyro[1]);
Zg.setText("Zg: " + gyro[2]);
}
try {
writer.write(accel[0]+" "+accel[1]+" "+accel[2]+" "+gyro[0]+" "+gyro[1]+" "+gyro[2]+"\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
But when I run the code over a physical device and touch the start button, the app crashes. Is there a way to prevent this?
Note: I also provide permission for writing external storages in manifest file.
EDIT: I checked logcat and found:
Java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.FileWriter.write(java.lang.String)' on a null object reference
at:
try {
writer.write(accel[0]+" "+accel[1]+" "+accel[2]+" "+gyro[0]+" "+gyro[1]+" "+gyro[2]+"\n");
} catch (IOException e) {
e.printStackTrace();
}
When I change this line:
writer = new FileWriter(folder);
to this:
writer = new FileWriter(folder+"example.txt",true);
App succesfully writes the data. But the name of file becomes "Documentsexample.txt". But my desire is "example.txt". I tried to remove "folder+" part from the line, tried to create folder in different ways. But same error returns after re-run. It seems no way other than above.