我正在制作我的第一个应用程序,在同化某些概念时我仍然遇到一些问题。这个想法是存储手机加速度计捕获的数据并将其存储在外部存储器中,以便以后用数学程序进行处理。正如您在代码中看到的那样,我尝试为外部和内部存储创建两种方法,这些方法中的第一种是给我错误的方法。我哪里出错了?应该存储生成的.txt在哪里?非常感谢你的帮助。
这是清单:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
这是.java:
public class MainActivity extends Activity implements SensorEventListener{
TextView x,y,z;
EditText dnombre;
private Sensor sensor;
private SensorManager acelerometro;
private long tiempoCreacion;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
acelerometro=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
sensor=acelerometro.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//convertimos en variables los displays de pantalla
x=(TextView)findViewById(R.id.xID);
y=(TextView)findViewById(R.id.yID);
z=(TextView)findViewById(R.id.zID);
dnombre = findViewById(R.id.nombreArchivo);
}
public void onResume(View vista){
super.onResume();
acelerometro.registerListener(this,sensor, SensorManager.SENSOR_DELAY_FASTEST);
tiempoCreacion = System.currentTimeMillis();
}
public void onPause(View vista){
super.onPause();
acelerometro.unregisterListener(this);
}
// concatenamos los xmil datos que nos entran, como variable solo entran datos xq el nombre lo ponemos nosotros
public void escribirCsv(String fileContents) {
//introducimos el nombre del file por la interfaz
String nombre = dnombre.getText().toString();
FileOutputStream outputStream;
try {
outputStream = openFileOutput(nombre, Context.MODE_APPEND | Context.MODE_PRIVATE);
outputStream.write(fileContents.getBytes());
outputStream.close();
//Toast.makeText(getBaseContext(), "File saved successfully!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
//guardar en almacenamiento externo
public void escribirCsvEx(String fileContents) {
String nombre = dnombre.getText().toString();
File datos = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "datos");
if (!datos.mkdirs()) {
System.out.println("directorio no creado");
}
}
// comprobaciones de si se puede guardar en almacenamiento externo
private boolean isExternalStorageWritable(){
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
System.out.println("es escribible");
return true;
}else{
return false;
}
}
public boolean checkPermission(String permission){
int check = ContextCompat.checkSelfPermission(this, permission);
if(check == PackageManager.PERMISSION_GRANTED){
System.out.println("tenemos permisos");
}
return (check == PackageManager.PERMISSION_GRANTED);
}
//guardar en almacenamiento interno
public void writeFile(String fileContents){
String nombre = dnombre.getText().toString();
if(isExternalStorageWritable())// && checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE))
{
File Dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/DirectorioDatos" );
if(!Dir.exists()){
Dir.mkdir();
}
File nombre_Archivo = new File(Dir,nombre);
try{
FileOutputStream fos = new FileOutputStream(nombre_Archivo);
fos.write(fileContents.getBytes());
fos.close();
Toast.makeText(this, "File Saved.", Toast.LENGTH_SHORT).show();
}catch (IOException e){
e.printStackTrace();
}
}else{
Toast.makeText(this, "Cannot Write to External Storage.", Toast.LENGTH_SHORT).show();
}
}
/*//crear aceleración resultante
public void aceResult(double ax,double ay,double az){
double ax2= pow(ax,2);
double ay2= pow(ay,2);
double az2= pow(az,2);
double atot= ax2+ay2+az2;
double aresul= sqrt(atot);
}*/
@Override
public void onSensorChanged(SensorEvent event) {
//valores a la consola
/*System.out.println("text");
System.out.println(System.currentTimeMillis()); //da valor en la consola no en movil*/
long tiempo = System.currentTimeMillis()-tiempoCreacion;
if(tiempo<=3000) {
String tiempoString = Long.toString(tiempo);
this.x.setText("X = " + event.values[0]);
this.y.setText("Y = " + event.values[1]);
this.z.setText("Z = " + event.values[2]);
//aceleracion resultante
double ax=event.values[0];
double ay=event.values[1];
double az=event.values[2];
double ax2= pow(ax,2);
double ay2= pow(ay,2);
double az2= pow(az,2);
double atot= ax2+ay2+az2;
double aresul= sqrt(atot);
String datos = tiempoString + ";" + event.values[0] + ";" + event.values[1] + ";" + event.values[2] + ";" + aresul + ";" + "\n";
escribirCsvEx(datos);
//SystemClock.sleep(7000);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//este no vale
}
}