Android Komponente um die aufgenommenen Daten später für Analyse anzuschauen.

  • 13 Antworten
  • Neuester Beitrag
Diskutiere Android Komponente um die aufgenommenen Daten später für Analyse anzuschauen. im Android App Entwicklung im Bereich Betriebssysteme & Apps.
T

the_time

Ambitioniertes Mitglied
Hallo,
ich habe eine kleine App implementiert um festzustellen ob der User in einem Fahrzeug sitzt. Die App berechnet den micotelsa wert vom Magnetfeld (EMF). Ich will sie jetzt testen, darum will ich die microtelsa Werte für ein paar Minuten aufnehmen und sie irgendwo speichern um sie mir später anzuschauen.

Welche Android komponente kann ich benutzen um die Aufname in diesem Sinne zu erreichen?

Schöne Grüße,
the_time
 
Jaiel

Jaiel

Experte
du meinst sowas wie ein ganz normales file? shared prefs wären da nciht sinnvoll jedenfalls
 
T

the_time

Ambitioniertes Mitglied
Ja oder wie wenn ich die Daten an den Server schicke dann kann ich auf sie zugreifen und sie mir angucken oder sie irgendwie in einer Liste vom TextView anzeige (Wenn so was gibt) dann kann ich die Werte live verfolgen.
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Sorry ich habe die Frage wohl falsch verstanden!!!

Wie ahst du es denn jetzt implementiert zur zeit?Woran genau scheiterst du zur Zeit bzw. kommst nciht wieter?
 
Zuletzt bearbeitet:
T

the_time

Ambitioniertes Mitglied
Ich wollte bloß halt wissen wie ich vorgehen soll und was von Alternativen mir stehen aber ich habe jetzt eine Verbindung mit dem Server (openshift) erstellt aber ich habe gedacht es gibts eine einfache alternative.
Also von diesen Alternativen hier steht mir in meinem Fall nur network connection zur Verfügung.

Storage Options | Android Developers

Der ursprüngliche Beitrag von 11:42 Uhr wurde um 12:29 Uhr ergänzt:

Ok ich jetzt ein Problem aber das hat mit dem Tile problem nichts zu tun. Ich versuche JSON String mit Asyncrask an den Server zu schicken aber ich habe im Logcat gemerkt dass dieser JSON string ungefähr 12 mal in jeder Sekunde an den Server abgesendet wird. Weiß jemand woran das liegt.

PHP:
public void onSensorChanged(SensorEvent sensorEvent) {
		synchronized (this) {
			if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
				float magX = sensorEvent.values[0];
				float magY = sensorEvent.values[1];
				float magZ = sensorEvent.values[2];

				magneticX.setText(Float.toString(sensorEvent.values[0]));
				magneticY.setText(Float.toString(sensorEvent.values[1]));
				magneticZ.setText(Float.toString(sensorEvent.values[2]));

				double teslaXYZ = (Math.sqrt((magX * magX) + (magY * magY)
						+ (magZ * magZ)));
				magneticT.setText(Double.toString(teslaXYZ));

				try {
					JSONObject tesla = new JSONObject();
					tesla.put("tesla", teslaXYZ);
					telsaString = tesla.toString();

					new MyAsyncTask().execute(telsaString);

				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
		}

	}

	class MyAsyncTask extends AsyncTask<String, Integer, String> {

		@Override
		protected String doInBackground(String... params) {
			// TODO Auto-generated method stub
			BufferedReader reader = null;

			try {
				System.out.println("The output of : doInBackground "
						+ params[0]);

				URL myUrl = new URL(
			        "https://serverside-rhcloud.com/webapi/tesla");

				HttpURLConnection conn = (HttpURLConnection) myUrl
						.openConnection();
				conn.setRequestMethod("POST");
				conn.setDoOutput(true);
				conn.setConnectTimeout(10000);
				conn.setReadTimeout(10000);
				conn.setRequestProperty("Content-Type", "application/json");
				conn.connect();
				DataOutputStream wr = new DataOutputStream(
						conn.getOutputStream());
				wr.writeBytes(params[0]);

				wr.close();

				StringBuilder sb = new StringBuilder();
				reader = new BufferedReader(new InputStreamReader(
						conn.getInputStream()));
				String line;

				while ((line = reader.readLine()) != null) {
					sb.append(line + "\n");

				}

				System.out.println("The output of the StringBulder: "
						+ sb.toString());

			} catch (IOException e) {

				e.printStackTrace();
				return null;
			} finally {
				if (reader != null) {
					try {
						reader.close();
						return null;
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}

			return null;

		}

		protected void onPostExecute(String result) {

			new Handler().postDelayed(new Runnable() {
				@Override
				public void run() {
					new MyAsyncTask().execute(telsaString);
				}
			}, 5 * 1000);

		}

	}
 
Jaiel

Jaiel

Experte
Weil der Sensor so oft getriggert wird vllt?
 
T

the_time

Ambitioniertes Mitglied
Und wie kann ich die Ausgabe vom Senser regulerien dass er nicht so oft getriggert wird?
 
Jaiel

Jaiel

Experte
lass dir was einfallen ;)

ich weiß nciht ob man ihn direkt einstellen kann aber du kannst immerhin eine bestimmte Zeit einstellen und erst dann die Sensordaten auswerten/behandlen wenn diese Zeit vergangen ist zum Beispiel so:

PHP:
//long oldTime=System.currentTimeMillis();
//long sensorTime=1000;

        public void onSensorChanged(SensorEvent sensorEvent) { 
        synchronized (this) { 
            if (/*System.currentTimeMillis()-oldTime>=sensorTime&&*/sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 
                
                //oldTime=System.currentTimeMillis();

                float magX = sensorEvent.values[0]; 
                float magY = sensorEvent.values[1]; 
                float magZ = sensorEvent.values[2]; 

                magneticX.setText(Float.toString(sensorEvent.values[0])); 
                magneticY.setText(Float.toString(sensorEvent.values[1])); 
                magneticZ.setText(Float.toString(sensorEvent.values[2])); 

                double teslaXYZ = (Math.sqrt((magX * magX) + (magY * magY) 
                        + (magZ * magZ))); 
                magneticT.setText(Double.toString(teslaXYZ)); 

                try { 
                    JSONObject tesla = new JSONObject(); 
                    tesla.put("tesla", teslaXYZ); 
                    telsaString = tesla.toString(); 

                    new MyAsyncTask().execute(telsaString); 

                } catch (JSONException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 

    }
heir würde er zum Beispiel nur circa jede Sekunde den Sensor auslösen (bzw. der Code in dem Listener) durch die vorgestellte Bedingung dass die Zeitspanne größer gleich 1000 ms ist(in der variablen sensortime)
 
T

the_time

Ambitioniertes Mitglied
Kannst du mir vllt erklären wieso wenn ich es so mache dann werden die Variablen "magX , magXY, magZ and teslaXYZ " in der MainActivity nicht angezeigt
aber wenn ich diese zeile "Thread.sleep(10 * 1000);" mit dem try block lösche dann werden sie angezeigt?


PHP:
	public void onSensorChanged(SensorEvent sensorEvent) {
		synchronized (this) {
			if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

				try {

					Thread.sleep(10 * 1000);

					float magX = sensorEvent.values[0];
					float magY = sensorEvent.values[1];
					float magZ = sensorEvent.values[2];

					magneticX.setText(Float.toString(sensorEvent.values[0]));
					magneticY.setText(Float.toString(sensorEvent.values[1]));
					magneticZ.setText(Float.toString(sensorEvent.values[2]));

					double teslaXYZ = (Math.sqrt((magX * magX) + (magY * magY)
							+ (magZ * magZ)));
					magneticT.setText(Double.toString(teslaXYZ));

					try {
						JSONObject tesla = new JSONObject();
						tesla.put("tesla", teslaXYZ);
						telsaString = tesla.toString();
						new MyAsyncTask().execute(telsaString);

					} catch (JSONException e) {
						e.printStackTrace();
					}
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Ja weil die variablen lokal deklariert sind und außerhalb dieser Methode nicht mehr existieren...
 
T

the_time

Ambitioniertes Mitglied
ham Ich habe sie global als klassenvariablen deklariert aber sie werden auch nicht angezeigt.

Der ursprüngliche Beitrag von 19:19 Uhr wurde um 19:29 Uhr ergänzt:

aber ich habe die 4 variablen global als Klassenvariablen deklariert und sie werden auch nicht angezeigt.
 
Jaiel

Jaiel

Experte
Achso cih habe deinen Hinweis auf den Sleep nciht bemerkt...

Was bitte ist "Thread"? du kannst nur thread objekte schlafen legen, die Methode Thread.sleep(); deutet jedoch auf eine statische Methode hin.

Du blockierst für ganze 10(!!!) sekunden den Kanal ich bin mir sicher Android hat etwas dagegen und schmeißt eine exception.

Es auf diese Weise, weniger Daten zu bekommen, zu lösen ist nicht gut.


Wie wärs wenn du einen Sensor listener registrierst denn dort kannst du sogar deine Rate einstellen

http://developer.android.com/refere...rEventListener, android.hardware.Sensor, int)
 
Zuletzt bearbeitet:
T

the_time

Ambitioniertes Mitglied
Es funktioniert mit sowas wie du in deinem beispiel gesagt hast :)

PHP:
			long curTime = System.currentTimeMillis();
			if ((curTime - lastUpdate) > 15000) {

				lastUpdate = curTime;
}
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Sehr gut evtl wärst du mit dem Sensormanager besser gefahren da damit unnötige Sensorabfragen vermieden werden
 
Ähnliche Themen - Android Komponente um die aufgenommenen Daten später für Analyse anzuschauen. Antworten Datum
5
6
5