Android Sensor Simulator

Corben

Mitglied
Nabend zusammen.

Ich habe zur Übungszwecken ein App geschrieben welches einem die Accelerometer Werte angibt. Da ich kein Android Gerät besitze benutze ich den Sensorsimulator der Firma OpenIntentsUG in Version 1.1.1.
Ich habe die erforderliche library natürlich dem Projekt hinzugefügt. Die Android Version ist 2.3.3.

Es funktioniert alles einwand frei, die app wird in dem AVD gestartet doch sobald ich mir die 3 Werte anzeigen lassen will stürtzt die App ab mit dem Fehler:
NoClassDefFoundError: hapra.sensor.Accelerometer$1
at hapra.sensor.Accelerometer.<init>(Accelerometer.java:35

Wenn ich die App so abändere um sie auf einem realen Device zu installieren funktioniert alles einwandfrei. Ich habe mir dazu mal ein Android Handy ausgeliehen und darauf klapt alles wunder bar, die App läuft. Wie kanndas sein?


Der Code:

SensorsActivity, hier wird ie App gestartet.
Java:
package hapra.sensor;

import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.*;
import android.content.*;
import android.app.*;


public class SensorsActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
    	boolean result = super.onCreateOptionsMenu(menu);
    	MenuInflater mi =getMenuInflater();
    	mi.inflate(R.menu.menu, menu);
    	return result;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
    	switch (item.getItemId()){
    	case R.id.accel:
    		Intent accel = new Intent(this, AccelerometerActivity.class);
    		startActivity(accel);
    		return true;
    	case R.id.gps:
    		Intent gps = new Intent(this, GPSActivity.class);
    		startActivity(gps);
    		return true;
    	case R.id.exit:
    		new AlertDialog.Builder(this)
    			.setTitle(R.string.exitConfirmTitle)
    			.setMessage(R.string.exitConfirmText)
    			.setPositiveButton("OK",new DialogInterface.OnClickListener() {
					
					public void onClick(DialogInterface dialog, int which) {
						finish();
						
					}
				}).setNegativeButton("Cancle", new DialogInterface.OnClickListener() {
					
					public void onClick(DialogInterface dialog, int which) {						
					}
				}).show();
    	}
    	return true;
    }    
}

Accelerometer
Java:
package hapra.sensor;

import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;
import org.openintents.sensorsimulator.hardware.Sensor;
import org.openintents.sensorsimulator.hardware.SensorEvent;
import org.openintents.sensorsimulator.hardware.SensorEventListener;

import android.content.Context;
import android.hardware.SensorManager;

/*import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;

*/

public class Accelerometer{
	private SensorManagerSimulator sm;
	//private SensorManager sm;
	private Accelerometer.Callback cb;
	
	public interface Callback{
		public void accelerationChanged(float x, float y, float z);
	}
	
	public Accelerometer(Context c, Accelerometer.Callback cb){
		this.cb = cb;
		//sm = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE);
		//sm=(SensorManagerSimulator) c.getSystemService(Context.SENSOR_SERVICE);
		sm=SensorManagerSimulator.getSystemService(c, Context.SENSOR_SERVICE);
		sm.connectSimulator();
		sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);		
	}
	
	private SensorEventListener listener = new SensorEventListener(){
		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy){			
		}
		
		@Override
		public void onSensorChanged(SensorEvent event){
			cb.accelerationChanged(event.values[0], event.values[1], event.values[2]);
		}
	};
	
	public void close(){
		sm.unregisterListener(listener);
	}
}

AccelerometerActivity
Java:
package hapra.sensor;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class AccelerometerActivity extends Activity implements Accelerometer.Callback{
	private Accelerometer a;
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.accel);
		a=new Accelerometer(this,this);
	}
	
	@Override
	public void accelerationChanged(float x, float y, float z){
		TextView tx = (TextView) findViewById(R.id.coordX);
		tx.setText(x+"");
		TextView ty = (TextView) findViewById(R.id.coordY);
		ty.setText(y+"");
		TextView tz = (TextView) findViewById(R.id.coordZ);
		tz.setText(z+"");
	}
	
	@Override
	public void onDestroy(){
		super.onDestroy();
		a.close();
	}
}
 

schlingel

Gesperrter Benutzer
Welche Android-Version hat denn dein Emulator und welche dein Device?

Der Fehler tritt ja in der Zeile hier auf:
Java:
private SensorEventListener listener = new SensorEventListener(){
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy){         
        }
        
        @Override
        public void onSensorChanged(SensorEvent event){
            cb.accelerationChanged(event.values[0], event.values[1], event.values[2]);
        }
    };

Ich kann mir also vorstellen, dass du mit einem neueren Android SDK für ein älteres Target programmierst. Das hat den nervigen Effekt, dass das Eclipse meint die Klasse gäbe es und sich auch beim Kompilieren für das ältere Target nicht beschwert aber am Gerät bzw. am Emulator dann die notwendigen Systemklassen nicht gefunden werden und es zu solchen Fehlern kommt.

Ich hab das dauert weil die alte ArrayAdapter-Klasse für Andorid 2.2 keine addAll-Methode hat.
 

Corben

Mitglied
leider nein, ich benutze ein AVD mit Version 2.3.3 (API 10).
mit GPS support
Accelerometer
Abstract LCD density 240
Max VM application heap size 24
RAM 256
und Touchscreen support
 

fastjack

Top Contributor
Deine App muß für den Simulatorbetrieb die sensorsimulator.jar includen, sonst gehts nicht. Providen reicht ebenfalls nicht aus.
 

Corben

Mitglied
Ich habe einen Ordner lib im Projekt erstellt, dann die sensorsimulator-lib-1.1.1.jar dort rein kopiert und dann project-->properties --->Java Build Path -->Libraries dort auf Add JARs und die sensorsimulator-lib-1.1.1.jar ausgewählt dann 2 mal mit ok bestätigt.
Meinst du das?
 

Corben

Mitglied
Jo, vielen Dank es geht:

Ich hab auf den Hinweis von fastjack noch mal Google bemüht. Ich hatte alles richtig gemacht nur etwas vergessen:
Projekt-->Properties-->Java Build Path-->Order and Export--> Hacken bei der selber hinzugefügten lib machen.

Thx :)
 

Ähnliche Java Themen

Neue Themen


Oben