Wert aus Beschleunigungssensor auslesen

  • 7 Antworten
  • Letztes Antwortdatum
P

philobi

Neues Mitglied
0
Hallo ich habe Folgendes vor. Ich habe ein Kleines Spiel gemacht bei dem ich gerne ein Objekt mit Hilfe der Sensoren Bewegen möchte. Also wenn ich mein Tablet nach links neige, soll sich das Objekt nach Links bewegen.

Folgendes hab ich jetzt gemacht, nur wird so meine App direkt beendet.

Meine Idee war, dass ich dadurch dann die vorher definierten Variablen für die x und y Beschleunigung ändere und somit dann die Position des Objektes

also Objekt.setxspeed(x)

Ich hoffe ihr versteht was ich meine ^^


Code:
public class MainActivity extends Activity implements SensorEventListener {

	Sensor accelerometer;
	SensorManager sm;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sm = (SensorManager) getSystemService(SENSOR_SERVICE);
		accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		sm.registerListener(this, accelerometer,
				SensorManager.SENSOR_DELAY_NORMAL);

		
	}

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

	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		int x = (int) event.values[0];
		int y = (int) event.values[1];

	}
 
Zuletzt bearbeitet:
Bekommst du irgendeine Fehlermeldung im LogCat?
 
Hallo, ja ich bekomme Folgende Meldung:

01-21 23:54:11.117: E/AndroidRuntime(11925): FATAL EXCEPTION: main
01-21 23:54:11.117: E/AndroidRuntime(11925): java.lang.ArrayIndexOutOfBoundsException
01-21 23:54:11.117: E/AndroidRuntime(11925): at com.example.sensor.MainActivity.onSensorChanged(MainActivity.java:39)
01-21 23:54:11.117: E/AndroidRuntime(11925): at android.hardware.SensorManager$ListenerDelegate$1.handleMessage(SensorManager.java:529)
01-21 23:54:11.117: E/AndroidRuntime(11925): at android.os.Handler.dispatchMessage(Handler.java:99)
01-21 23:54:11.117: E/AndroidRuntime(11925): at android.os.Looper.loop(Looper.java:130)
01-21 23:54:11.117: E/AndroidRuntime(11925): at android.app.ActivityThread.main(ActivityThread.java:3683)
01-21 23:54:11.117: E/AndroidRuntime(11925): at java.lang.reflect.Method.invokeNative(Native Method)
01-21 23:54:11.117: E/AndroidRuntime(11925): at java.lang.reflect.Method.invoke(Method.java:507)
01-21 23:54:11.117: E/AndroidRuntime(11925): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-21 23:54:11.117: E/AndroidRuntime(11925): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-21 23:54:11.117: E/AndroidRuntime(11925): at dalvik.system.NativeStart.main(Native Method)
 
Tja dann bekommst nur scheinbar nur eine value in deinem Event.

Guck mal ob du überhaupt den richtigen Sensor benutzt.
Du kannst auch vorher mit:
event.values.length gucken wie viele Einträge überhaupt vorhanden sind.

Also nochmal genauer
Ich vermute das passiert genau hier:
int y = (int) event.values[1];

weil das values Array nur einen Wert enthält (den bei 0), wenn du nun versuchst auf 1 zuzugreifen erhälst du genau die Fehlermeldung die du im log hast.
 
wenn ich aber folgendermaßen vorgehe:

Code:
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sm = (SensorManager) getSystemService(SENSOR_SERVICE);
		accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		sm.registerListener(this, accelerometer,
				SensorManager.SENSOR_DELAY_NORMAL);

		acceleration = (TextView) findViewById(R.id.acceleration);
	}

und weiter unten:

Code:
public void onSensorChanged(SensorEvent event) {
		acceleration.setText("X:"+event.values[0]+"\nY:"+event.values[1]+"\nZ: "+event.values[2]);

	}


bekomme ich den aktuellen Wert für x, y und z auf dem Tablet angezeigt.
 
und wenn du die in eine variable speichern willst stürzt der ab?

Dann würde ich da mal mit dem debugger durchgehen und gucken was da so passiert.
Hab den Sensor bisher nie benutzt, ka ob der immer alle 3 werte zurück gibt oder wenn eine bewegung evtl nur in eine richtung stattfindet er auch nur 1 wert zurück gibt oder so. (das wäre allerdings sehr bescheiden)
 
Erstmal vielen Dank für deine Hilfe amfa :)

Ich habe jetzt hinbekommen, hier mal die Lösung wenn jemand anders auch das Problem hat.

Code:
public class Game extends Activity implements SensorEventListener{
	private GameView theGameView;
	Sensor accelerometer;
	SensorManager sm;
	float [] mAcceleration = new float[3];

Ich musste noch ein array anlegen und die Werte darin Speichern.

Code:
public void onSensorChanged(SensorEvent event) {
		System.arraycopy(event.values, 0, mAcceleration, 0, 3);
		int x =(int) getAccelerationOnXAxis()*-1;
		int y =(int) getAccelerationOnYAxis();
		
	}
	public float getAccelerationOnXAxis(){
		return mAcceleration[0];
	}
	
	public float getAccelerationOnYAxis(){
		return mAcceleration[1];
	}

Danach konnte ich über die Get Methoden x und y den jeweiligen Wert zuweisen.
 
Versteh ich zwar gerade nicht warum er bei der anderen methode ein IndexOutOfBound geworfen hat.
der müsste bei der jetzigen Lösung eigentlich genauso fliegen.

naja.. solangs jetzt funktioniert würde ich erst mal nicht weiter nachfragen :D
 
Zurück
Oben Unten