2009-06-29 7 views
10

Ich baue eine Anwendung für die Android-Plattform und möchte den Beschleunigungssensor verwenden. Nun habe ich eine sehr schöne Anwendung für die Sensorsimulation gefunden (OpenIntents' SensorSimulator), aber für das, was ich machen möchte, möchte ich meine eigene Sensorsimulator-Anwendung erstellen.Wie baue ich einen Sensorsimulator für Android?

Ich habe keine Informationen gefunden, wie man das macht (ich weiß nicht, ob die Demontage des Glases des Simulators korrekt ist) und, wie gesagt, ich möchte eine kleinere und einfachere Version eines Sensorsimulators bauen, besser geeignet für meine Absichten.

Weißt du, wo könnte ich anfangen? Wo kann ich sehen, welche Codeteile ich erstellen muss?

Grundsätzlich alle meine fragen nur nach einer Richtung.

Antwort

8

Nun, es scheint, dass Sie eine Anwendung erstellen möchten, die die Sensoren auf einem Android-Gerät für Ihre Anwendung beim Testen auf dem Emulator emuliert.
Wahrscheinlich in der Anwendung, haben Sie eine Zeile wie diese:

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 

Warum eine Schnittstelle nicht erstellen, die die Methoden, die Sie von Sensormanager verwenden hat:

interface MySensorManager { 
    List<Sensor> getSensorList(int type); 

    ... // You will need to add all the methods you use from SensorManager here 
} 

und erstellen Sie einen Wrapper für Sensormanager, dass ruft nur diese Methoden auf einem realen SensorManager-Objekt:

class MySensorManagerWrapper implements MySensorManager { 
    SensorManager mSensorManager; 

    MySensorManagerWrapper(SensorManager sensorManager) { 
     super(); 
     mSensorManager = sensorManager; 
    } 

    List<Sensor> getSensorList(int type) { 
     return mSensorManager.getSensorList(type_; 
    } 

    ... // All the methods you have in your MySensorManager interface will need to be defined here - just call the mSensorManager object like in getSensorList() 
} 

Und dann erstellen Sie einen anderen MySensorManager, der diesmal commu niziert über einen Socket auf eine Desktop-Anwendung, die Sie erstellen, wo Sie die Sensorwerte oder etwas eingeben:

class MyFakeSensorManager implements MySensorManager { 
    Socket mSocket; 

    MyFakeSensorManager() throws UnknownHostException, IOException { 
     super(); 
     // Connect to the desktop over a socket 
     mSocket = = new Socket("(IP address of your local machine - localhost won't work, that points to localhost of the emulator)", SOME_PORT_NUMBER); 
    } 

    List<Sensor> getSensorList(int type) { 
     // Use the socket you created earlier to communicate to a desktop app 
    } 

    ... // Again, add all the methods from MySensorManager 
} 

Und schließlich ersetzen Ihre erste Linie:

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 

Mit einer neuen Linie:

MySensorManager mSensorManager; 
if(YOU_WANT_TO_EMULATE_THE_SENSOR_VALUES) { 
    mSensorManager = new MyFakeSensorManager(); 
else { 
    mSensorManager = new MySensorManagerWrapper((SensorManager)getSystemService(SENSOR_SERVICE)); 
} 

Jetzt können Sie dieses Objekt anstelle des zuvor verwendeten SensorManagers verwenden.

+1

Hallo Isaac !! Danke für deine Antwort. Das ist mehr oder weniger das, was ich bauen will, ich werde es versuchen und euch alle wissen lassen, wie es sich entwickelt hat. =) – Hugo

+0

Hallo, hast du jemals die Lösung implementiert? Ich habe es kürzlich ausprobiert und bin auf das Problem gestoßen, ich müsste neue SensorEvent-Objekte erstellen, aber ich kann die Werte nicht setzen, da sie in der SensorEvent-Klasse endgültig sind. Als ich versuchte dies zu umgehen, indem ich es über Reflektion einstellte, bekam ich ClassNotFound Fehler auf dem SensorEvent, wenn ich mich richtig erinnere ... – andreas