我需要一些有关此应用程序的帮助。该应用程序注册加速度计和磁传感器的值。我做了这个,应用程序注册了两个传感器的数据。但应用程序进入后台,数据继续记录。然后,如果我再次启动应用程序,就像文件(SD 卡)中的 2 个应用程序记录,时间不同。
我需要应用程序运行,直到我按下返回按钮。可能是编写应用程序的方法不是最好的,但我现在不需要一个完美的应用程序。
这是代码应用程序。我不知道如何注册 2 个传感器,我用代码进行了测试。所以,问题是为什么我的应用程序进入后台?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Declaro el timer encargado de Acelerometro
Timer t = new Timer();
//inicio el schedule function and rate para el contador cada 5 seg
t.scheduleAtFixedRate(new TimerTask() { //ojo
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {//aqui agrego el codigo a ejecutar cada 5 seg
TextView tv = (TextView) findViewById(R.id.main_timer_text);
tv.setText(String.valueOf(time));
time += 1;
boolean sdDisponible = false;
boolean sdAccesoEscritura = false;
//Comprobamos el estado de la memoria externa (tarjeta SD)
String estado = Environment.getExternalStorageState();
// SI SD es montada ---> True
if (estado.equals(Environment.MEDIA_MOUNTED))
{
sdDisponible = true; // tenemos acceso a la SD
sdAccesoEscritura = true; // Tenemos acceso asi que escribirmos
}
//Si tenemos acceso a la SD pero solo como Lectura
else if (estado.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
{
sdDisponible = true; // Hay acceso
sdAccesoEscritura = false; // no podemos Escribir
}
else
// Si no tenemos acceso de ninguna forma
{
sdDisponible = false; // No hay acceso a la SD
sdAccesoEscritura = false; // No podemos Escribir
}
// SI SD disponible y tenemos permisos GRABAMOS
if (sdDisponible && sdAccesoEscritura)
{
try{
//NO las uso //xstr=Float.toString(X); // Realizando el cast de float a string
//ystr=Float.toString(Y);
//zstr=Float.toString(Z);
String datos=t_real+","+X+","+Y+","+Z;
File file = new File("/sdcard/AccSD.txt"); ///sdcard/AccSD.txt
BufferedWriter writer = new BufferedWriter(new FileWriter(file,true));
writer.write(datos);
writer.newLine();
writer.flush();
writer.close();
}
catch (Exception ex)
{
Log.e("Ficheros", "Error al escribir fichero a tarjeta SD");
}
}
}
});
}
}, 0, 5000); //FIN Captura Acelerimetro
//Inicio Del OTRO SENSOR
//inicio el schedule function and rate para el contador cada 2 seg
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() { //aqui agrego el codigo a ejecutar cada 2 seg
TextView tv2 = (TextView) findViewById(R.id.main_timer_text2);
tv2.setText(String.valueOf(time2));
time2 += 1;
//COdigo captura magentico
boolean sdDisponible = false;
boolean sdAccesoEscritura = false;
//Comprobamos el estado de la memoria externa (tarjeta SD)
String estado = Environment.getExternalStorageState();
// SI SD es montada ---> True
if (estado.equals(Environment.MEDIA_MOUNTED))
{
sdDisponible = true; // tenemos acceso a la SD
sdAccesoEscritura = true; // Tenemos acceso asi que escribirmos
}
//Si tenemos acceso a la SD pero solo como Lectura
else if (estado.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
{
sdDisponible = true; // Hay acceso
sdAccesoEscritura = false; // no podemos Escribir
}
else
// Si no tenemos acceso de ninguna forma
{
sdDisponible = false; // No hay acceso a la SD
sdAccesoEscritura = false; // No podemos Escribir
}
// SI SD disponible y tenemos permisos GRABAMOS
if (sdDisponible && sdAccesoEscritura)
{
try{
//NO las uso //xstr=Float.toString(X); // Realizando el cast de float a string
//ystr=Float.toString(Y);
//zstr=Float.toString(Z);
String datos=t_real+","+Xmg+","+Ymg+","+Zmg;
File file = new File("/sdcard/MagSD.txt"); ///sdcard/AccSD.txt
BufferedWriter writer2 = new BufferedWriter(new FileWriter(file,true));
writer2.write(datos);
writer2.newLine();
writer2.flush();
writer2.close();
}
catch (Exception ex)
{
Log.e("Ficheros", "Error al escribir fichero a tarjeta SD");
}
}
}
});
}
}, 0, 2000); // AQUI MODIFICO EL INTERVALO DE TIEMPO !!!!!
//inicio el schedule function and rate para el contador de tiempo real
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv2 = (TextView) findViewById(R.id.main_timer_text3);
tv2.setText(String.valueOf(t_real));
t_real += 1;
}
});
}
}, 0, 1000); // FIN Captura otro sensor
}
// Estas entradas, onResume y onStop Detienen el servicio de sensores
// para evitar gasto de bateria innecesaria
@Override
protected void onResume() {
super.onResume();
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
//Listando sensores
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);
List<Sensor> MGsensor = sm.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
if (sensors.size() > 0) {
sm.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_GAME);
}
if (MGsensor.size() > 0) {
sm.registerListener(this, MGsensor.get(0), SensorManager.SENSOR_DELAY_GAME);
}
}
@Override
protected void onStop() {
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
sm.unregisterListener(this);
super.onStop();
MainActivity.this.finish(); // Linea que finaliza toda mi actividad EVITA ejeci
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Auto-generated method stub
}
// Aqui es donde capturamos los datos
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
//
Sensor sensor = event.sensor;
if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
X = event.values[0];
Y = event.values[1];
Z = event.values[2];
}
else if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
Xmg = event.values[0];
Ymg = event.values[1];
Zmg = event.values[2];
}
//
// Aqui es donde se dan los datos (X-Y-Z cambian todo el rato)
}
}
}