2009-06-29 114 views
10

我正在構建Android平臺的應用程序,我想使用加速度計。現在,我發現了一個非常好的傳感器仿真應用程序(OpenIntents' SensorSimulator),但是爲了我想要做的事情,我想創建自己的傳感器仿真器應用程序。如何構建適用於Android的傳感器模擬器?

我還沒有找到關於如何做到這一點的信息(我不知道如果反彙編模擬器的jar是正確的),正如我所說,我想建立一個更小和更簡單的傳感器模擬器版本,更適合我的意圖。

你知道我從哪裏開始?我在哪裏可以看到我需要構建的代碼片段?

基本上,我所要求的只是一些方向。

回答

8

好吧,看起來你想做的是一個應用程序,它將在模擬器上進行測試時,在您的應用程序上模擬Android設備上的傳感器。
可能在你的應用程序,你有這樣一行:

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 

爲什麼不創建一個具有您的SensorManager使用的方法的接口:

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

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

然後創建的SensorManager一個包裝,只需在真實的SensorManager對象上調用這些方法即可:

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() 
} 

然後創建另一個MySensorManager,即此次通訊通過套接字到桌面應用程序nicates您將創建在其中輸入傳感器值或東西:

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 
} 

最後,替換您的第一行:

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 

隨着新線:

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

現在您可以使用該對象而不是之前使用的SensorManager。

+1

嗨艾薩克!感謝您的回答。這或多或少是我想要建立的,我會試一試,讓大家知道它是如何發生的。 =) – Hugo 2009-06-30 16:20:13